home *** CD-ROM | disk | FTP | other *** search
/ Aminet 31 / Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso / Aminet / misc / math / convertor.lha / e-source / convertor.e
Encoding:
Text File  |  1999-03-11  |  128.1 KB  |  3,216 lines

  1. OPT PREPROCESS,OSVERSION=37,LARGE
  2.  
  3. /* This source-code was not intended to be made public, so forgive mysterious (and French) comments...
  4.  
  5.    Also, it was the first program I ever wrote with AmigaE and with MUI, so there are many parts that
  6. aren't well written.*/
  7.  
  8. MODULE 'muimaster','libraries/tmui','libraries/muip','mui/muicustomclass',
  9.        'intuition/classes','intuition/classusr','intuition/intuition',
  10.        'utility/tagitem','utility/hooks',
  11.        'amigalib/boopsi',
  12.        'libraries/gadtools','libraries/asl',
  13.        'tools/longreal','tools/mathtermd',
  14.        '*convertorlocale',
  15.        'cyclearray',
  16.        'afc/tooltype'
  17.  
  18. #define PROGNAME 'Convertor 2.79'
  19. #define PROGVER '$VER: Convertor 2.79 (08/01/99)'
  20.  
  21. #define _returnid(id) doMethodA(app,[MUIM_Application_ReturnID,id])
  22.  
  23. OBJECT myreal
  24.     a,b        /*  Pour lire les attribus privés de longreal... :-þ */
  25. ENDOBJECT
  26. OBJECT base
  27.     type
  28.     name
  29.     value:longreal
  30.     zero:longreal
  31. ENDOBJECT
  32. OBJECT prefix
  33.     name
  34.     exp:longreal
  35. ENDOBJECT
  36. OBJECT group
  37.     list:PTR TO LONG
  38.     title:PTR TO CHAR
  39.     sze
  40. ENDOBJECT
  41. OBJECT composed
  42.     base:PTR TO LONG -> en fait «PTR TO (PTR TO CHAR)» :-)
  43.     pfx:PTR TO LONG
  44.     expo:PTR TO LONG
  45.     sze
  46. ENDOBJECT
  47. OBJECT undonode /*ce qui doit être sauvé*/
  48.     v1:PTR TO longreal,v2:PTR TO longreal
  49.     u1:PTR TO composed,u2:PTR TO composed
  50. ENDOBJECT
  51. OBJECT sstring_data
  52.     empty:CHAR
  53. ENDOBJECT
  54. OBJECT droplist_data
  55.     empty:CHAR
  56. ENDOBJECT
  57. ENUM SR_ALPHA=1,SR_NUMERIC
  58. ENUM OP_MUL=1,OP_DIV,OP_REPL
  59. ENUM OBJ_COMPF=1,OBJ_BASEF,OBJ_COMPL
  60. CONST PFX_ORIGINAL=99, OLDC=1,NEWC=2
  61. ENUM DR_LEFT=1,DR_CURR,DR_RIGHT,DR_UNIVERSAL
  62.  
  63. DEF running,result
  64. DEF ldtxt,app=NIL,window=NIL,sigs=0,
  65.     lvt_pfx:PTR TO LONG,          -> "Liste des préfixes"
  66.     ug, ud,                                /*Unités  */
  67.     vg, vd                                 /*Valeurs*/
  68. DEF bt_a,bt_b,bt_c, accu,
  69.     ld
  70. DEF cat:PTR TO catalog_convertor            /*Localisation*/
  71. DEF lv_groups,lv_pfx,lv_units               /*List views*/
  72. DEF l_groups ,l_pfx ,l_units,               /*Lists    */
  73.     str[50]:STRING,q:PTR TO CHAR,r[50]:STRING,
  74.     handler,oldstdout,gptr:PTR TO group,
  75.     statusu,bases[300]:ARRAY OF LONG,bptr:PTR TO base,ptr:PTR TO composed,groups[50]:ARRAY OF LONG,glen,
  76.     pref[21]:ARRAY OF prefix,si[20]:ARRAY OF LONG,nsi,
  77.     nbases,
  78.     line,i,n,nunits,
  79.     value1:longreal,unit1:PTR TO composed,fact1:longreal,zero1:longreal,type1[20]:STRING,
  80.     value2:longreal,unit2:PTR TO composed,fact2:longreal,zero2:longreal,type2[20]:STRING,
  81.     undef1=FALSE,undef2=FALSE,
  82.     undo=NIL:PTR TO cyclearray,current,un:PTR TO undonode,
  83.     cur,z,o,
  84.     s:longreal,t:longreal,ten:longreal,
  85.     a:PTR TO CHAR,b:PTR TO CHAR,longstr[600]:STRING,
  86.     basegroup=FALSE,noconvert=FALSE,
  87.     bubbles=FALSE,g1,g2,g3,
  88.     menu,filereq:PTR TO filerequester,
  89.     ttype=NIL:PTR TO tooltype,undosteps=20
  90.  
  91. DEF strwin,strstr,strarg,strarg2
  92.  
  93. DEF cont:PTR TO group
  94.  
  95. DEF cl_sstring   =NIL: PTR TO mui_customclass,  /*classes*/
  96.     cl_droplist=NIL: PTR TO mui_customclass
  97.  
  98. ENUM ID_ABOUT=1,ID_MABOUT,ID_HIDE,ID_RESET,ID_PREFS,ID_HCONT,ID_HSBC,ID_BUBBLES,/*General&Help*/
  99.      ID_UNICALC,ID_CALC,ID_UNDO,ID_REDO,ID_SICONVERT,ID_INVERSE,ID_SHOWFORMULA, /*Tools*/
  100.         ID_MNU_NOCONVERT,ID_MNU_ADD,ID_MNU_SUBSTR,ID_SWITCH,
  101.      ID_CALCL,ID_CALCR,ID_LEFTU,ID_RIGHTU,ID_OPENG,ID_READU,ID_WRITE,           /*Unités*/
  102.      ID_SETLEFT,ID_SETRIGHT,                                                    /*COTE*/
  103.      ID_STRDONE,ID_GRENAME,ID_BRENAME,ID_SETZERO,ID_UDSAVE,ID_CRENAME,          /*UNITDATA*/
  104.         ID_SADD,ID_GADD,ID_BADD,ID_CADD,ID_CDEL,ID_BDEL,ID_GDEL,ID_GSORT,
  105.         ID_ASORT,ID_NSORT,ID_RSORT,
  106.         ID_ABOUTUD,ID_LOADUD,ID_LOADFROM,ID_SAVEAS,ID_NEWUD
  107.  
  108. ENUM ER_NOUD=1,ER_EMUD,ER_BADUD,ER_BADFORMAT,ER_NOCLASSES,ER_ASL,ER_LOC,ER_MATH
  109. DEF point:PTR TO CHAR
  110. ENUM GROUP=1,BASE,COMPOSED,NUMERIC
  111.  
  112. /****************************************************************************/
  113. /* sString class                                                            */
  114. /****************************************************************************/
  115.  
  116. PROC sstring_dragquery(/*cl:PTR TO iclass,*/obj:PTR TO object,msg:PTR TO muip_dragdrop)
  117. DEF dat1,dat2
  118.                                     /*msg.obj:Source du drag;obj:destination, fait avec cette classe*/
  119.   dat1:=muiUserData(msg.obj)
  120.   dat2:=muiUserData(obj)
  121.   IF msg.obj=obj -> Il ne faut pas "draguer" un String sur lui-même.
  122.     RETURN (MUIV_DragQuery_Refuse)
  123.   ELSEIF (dat1=dat2) OR ((dat2=OBJ_COMPF) AND (dat1=OBJ_COMPL))
  124.     RETURN (MUIV_DragQuery_Accept)
  125.   ELSE
  126.     RETURN (MUIV_DragQuery_Refuse)
  127.   ENDIF
  128. ENDPROC
  129.  
  130. PROC sstring_dragdrop(/*cl:PTR TO iclass,*/obj,msg:PTR TO muip_dragdrop)
  131. DEF entry,dat
  132.     dat:=muiUserData(msg.obj)
  133.     IF dat = OBJ_COMPL /*1) from a droplist.mcc to an sString*/
  134.         IF obj=ud
  135.             readu(TRUE)
  136.         ELSE
  137.             readu(FALSE)
  138.         ENDIF
  139.         convert()
  140.     ELSE /*2) from an sString to another:*/
  141.         mget(msg.obj,MUIA_String_Contents,{entry})
  142.         set(obj,MUIA_String_Contents,entry)
  143.         IF obj=ug
  144.             unit1.copycomp(unit2)
  145.             dCopy(fact1,fact2)
  146.             dCopy(zero1,zero2)
  147.             StrCopy(type1,type2)
  148.         ELSE
  149.             unit2.copycomp(unit1)
  150.             dCopy(fact2,fact2)
  151.             dCopy(zero2,zero1)
  152.             StrCopy(type1,type2)
  153.         ENDIF
  154.         convert()
  155.     ENDIF
  156.     savelast()
  157. ENDPROC 0
  158.  
  159. PROC sstring_dispatcher(cl:PTR TO iclass,obj,msg:PTR TO msg)
  160.   DEF methodid                          /*I removed the cl args just to avoid having an "Unreferenced" message*/
  161.   methodid:=msg.methodid
  162.   SELECT methodid
  163.     CASE MUIM_DragQuery; RETURN (sstring_dragquery(/*cl,*/obj,msg))
  164.     CASE MUIM_DragDrop ; RETURN (sstring_dragdrop (/*cl,*/obj,msg))
  165.    ENDSELECT
  166. ENDPROC (doSuperMethodA(cl,obj,msg))
  167.  
  168. /****************************************************************************/
  169. /* DropList class                                                           */
  170. /****************************************************************************/
  171.  
  172. PROC droplist_dragquery(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_dragdrop)
  173.  
  174.     IF (msg.obj=obj)
  175.         IF obj=l_groups
  176.             mget(obj,MUIA_List_Active,{cur})
  177.             IF cur=(glen+1)
  178.                 RETURN (MUIV_DragQuery_Refuse)
  179.             ENDIF
  180.             /*mget(obj,MUIA_List_DropMark,{cur})
  181.             IF cur=(glen+2)
  182.                 RETURN (MUIV_DragQuery_Refuse)
  183.             ENDIF*/
  184.         ENDIF
  185.         RETURN (doSuperMethodA(cl,obj,msg))
  186.     ELSEIF (muiUserData(msg.obj)<>0) AND (obj <> l_groups)
  187.         RETURN (MUIV_DragQuery_Accept)
  188.     ELSE
  189.         RETURN (MUIV_DragQuery_Refuse)
  190.     ENDIF
  191. ENDPROC
  192.  
  193. PROC droplist_dragdrop(cl:PTR TO iclass,obj,msg:PTR TO muip_dragdrop)
  194. DEF dropmark,j,bb,bbb,ls:PTR TO LONG
  195.  
  196.     mget(obj,MUIA_List_DropMark,{dropmark})
  197.  
  198.     IF (msg.obj=obj)
  199.         mget(obj,MUIA_List_Active,{i})   /*du i au dropmark*/
  200.         IF (dropmark <> i) AND (dropmark <> (i+1))  -> vrai déplacement?
  201.             IF obj=l_groups
  202.                 IF dropmark < i
  203.                     bb:=groups[dropmark]
  204.                     FOR j:=dropmark+1 TO i
  205.                         bbb:=groups[j]
  206.                         groups[j]:=bb
  207.                         bb:=bbb
  208.                     ENDFOR
  209.                     groups[dropmark]:=bb
  210.                 ELSE
  211.                     IF dropmark=(glen+2) -> after Base -> move it back
  212.                         doMethodA(obj,[MUIM_List_Move,dropmark-1,i])
  213.                         set(obj,MUIA_List_Active,i)
  214.                     ELSE
  215.                         dropmark:=dropmark-1
  216.                         bb:=groups[i]
  217.                         FOR j:=i TO (dropmark-1)
  218.                             groups[j]:=groups[j+1]
  219.                         ENDFOR
  220.                         groups[dropmark]:=bb
  221.                     ENDIF
  222.                 ENDIF
  223.             ELSE
  224.                 mget(l_groups,MUIA_List_Active,{cur})
  225.                 IF basegroup
  226.                     IF dropmark<i /*montée*/
  227.                         bb:=bases[dropmark]
  228.                         FOR j:=dropmark+1 TO i
  229.                             bbb:=bases[j]
  230.                             bases[j]:=bb
  231.                             bb:=bbb
  232.                         ENDFOR                                /* Montée   Descente   */
  233.                         bases[dropmark]:=bb                   /* 1   1     1   1     */
  234.                                                               /* 2 * 5 drp 2 / 3  i  */
  235.                     ELSE  /*Descente*/                        /* 3 \ 2 d+1 3 / 4     */
  236.                         dropmark:=dropmark-1                  /* 4 \ 3     4 / 5     */
  237.                         bb:=bases[i]                          /* 5 \ 4 i   5 * 2 drp */
  238.                         FOR j:=i TO (dropmark-1)              /* 6   6     6   6     */
  239.                             bases[j]:=bases[j+1]
  240.                         ENDFOR
  241.                         bases[dropmark]:=bb
  242.                     ENDIF
  243.                 ELSE
  244.                     gptr:=groups[cur]
  245.                     ls:=gptr.list
  246.                     IF dropmark<i /*montée*/
  247.                         bb:=ls[dropmark]
  248.                         FOR j:=dropmark+1 TO i
  249.                             bbb:=ls[j]
  250.                             ls[j]:=bb
  251.                             bb:=bbb
  252.                         ENDFOR
  253.                         ls[dropmark]:=bb
  254.  
  255.                     ELSE  /*Descente*/
  256.                         dropmark:=dropmark-1 -> Dropmark serait-il décalé?
  257.                         bb:=ls[i]
  258.                         FOR j:=i TO (dropmark-1)
  259.                             ls[j]:=ls[j+1]
  260.                         ENDFOR
  261.                         ls[dropmark]:=bb
  262.                     ENDIF
  263.                 ENDIF
  264.             ENDIF
  265.             RETURN (doSuperMethodA(cl,obj,msg))
  266.         ENDIF
  267.     ELSE
  268.  
  269.         mget(l_groups,MUIA_List_Active,{cur})
  270.  
  271.         IF msg.obj=vg
  272.             askstr(cat.msgBaseName.getstr(),'',BASE)
  273.             strarg:=dropmark;i:=FALSE
  274.             strarg2:=TRUE
  275.         ELSEIF msg.obj=vd
  276.             askstr(cat.msgBaseName.getstr(),'',BASE)
  277.             strarg:=dropmark;i:=FALSE
  278.             strarg2:=FALSE
  279.         ELSEIF msg.obj=ug
  280.             IF basegroup
  281.                 Mui_RequestA(app,window,0,cat.msgCompVsBgT.getstr(),NIL,cat.msgCompVsBg.getstr(),NIL)
  282.             ELSE
  283.                 addcomp(cur,unit1,dropmark)
  284.             ENDIF
  285.         ELSEIF msg.obj=ud
  286.             IF basegroup
  287.                 Mui_RequestA(app,window,0,cat.msgCompVsBgT.getstr(),NIL,cat.msgCompVsBg.getstr(),NIL)
  288.             ELSE
  289.                 addcomp(cur,unit2,dropmark)
  290.             ENDIF
  291.         ENDIF
  292.  
  293.     ENDIF
  294. ENDPROC 0
  295.  
  296. PROC droplist_dispatcher(cl:PTR TO iclass,obj,msg:PTR TO msg)
  297.   DEF methodid
  298.   methodid:=msg.methodid
  299.   SELECT methodid
  300.     CASE MUIM_DragQuery; RETURN (droplist_dragquery(cl,obj,msg))
  301.     CASE MUIM_DragDrop ; RETURN (droplist_dragdrop (cl,obj,msg))
  302.    ENDSELECT
  303. ENDPROC (doSuperMethodA(cl,obj,msg))
  304.  
  305. PROC exitclasses()
  306.   IF (cl_sstring   ) THEN Mui_DeleteCustomClass(cl_sstring)
  307.   IF (cl_droplist) THEN Mui_DeleteCustomClass(cl_droplist)
  308. ENDPROC
  309.  
  310. PROC initclasses()
  311.   cl_sstring:= eMui_CreateCustomClass(NIL,MUIC_String,NIL,SIZEOF sstring_data,{sstring_dispatcher})
  312.   cl_droplist:=eMui_CreateCustomClass(NIL,MUIC_List,NIL,SIZEOF droplist_data,{droplist_dispatcher})
  313.   IF (cl_sstring AND cl_droplist) THEN RETURN TRUE
  314.   exitclasses()
  315. ENDPROC FALSE
  316.  
  317. /****************************************************************************
  318. * Main Program                                                              *
  319. ****************************************************************************/
  320.  
  321. PROC main() HANDLE
  322.  
  323.     localebase:=OpenLibrary('locale.library',0)
  324.     IF localebase=NIL
  325.         Raise(ER_LOC)
  326.     ENDIF
  327.     NEW cat.create()
  328.     cat.open()
  329.  
  330.     ldtxt:=[cat.msgLevel.getstr(),cat.msgDifference.getstr(),NIL]
  331.  
  332.     NEW ttype.tooltype()
  333.  
  334.     z:=Open('Convertor2.7.info',OLDFILE)
  335.     IF z    -> IF the icons exists...
  336.         Close(z)
  337.         ttype.grab('Convertor2.7')
  338.         z:=ttype.get('UNDOSTEPS')
  339.         IF z THEN undosteps:=Val(z)
  340.     ENDIF
  341.     dInit()
  342.     mtdInit(ER_MATH)
  343.  
  344.     NEW unit1
  345.     NEW unit2
  346.     unit1.base:=String(5)
  347.     unit2.base:=String(5)
  348.  
  349.     NEW undo.cyclearray(undosteps)
  350.     FOR i:=0 TO undosteps-1
  351.         undo.setitem(i,NIL)
  352.     ENDFOR
  353.     current:=undosteps-1
  354. -> NM_ITEM,0,"Texte","raccourci",opt,(multiple exclusivité),action (voir boucle en bas)
  355.  
  356.     menu:= [
  357.     NM_TITLE,0,cat.msgGeneral.getstr(),0,0,0,0,
  358.         NM_ITEM,  0, cat.msgAbout.getstr(),     '?', 0, 0, ID_ABOUT,
  359.         NM_ITEM,  0, cat.msgAboutMui.getstr(),  '''',0, 0, ID_MABOUT,
  360.         NM_ITEM,  0, cat.msgMuiPrefs.getstr(),  'P', 0, 0, ID_PREFS,
  361.         NM_ITEM,  0, NM_BARLABEL,                0,  0, 0, 0,
  362.         NM_ITEM,  0, cat.msgHide.getstr(),      'Z', 0, 0, ID_HIDE,
  363.         NM_ITEM,  0, cat.msgReset.getstr(),     'W', 0, 0, ID_RESET,
  364.         NM_ITEM,  0, cat.msgQuit.getstr(),      'Q', 0, 0, MUIV_Application_ReturnID_Quit,
  365.  
  366.     NM_TITLE,0,cat.msgTools.getstr(),0,0,0,0,
  367.         NM_ITEM,  0, cat.msgConvert.getstr(),   'C', 0, 0, ID_UNICALC,
  368.         NM_ITEM,  0, cat.msgUnDo.getstr(),      'K', 0, 0, ID_UNDO,
  369.         NM_ITEM,  0, cat.msgReDo.getstr(),      'R', 0, 0, ID_REDO,
  370.         NM_ITEM,  0, cat.msgConvertSI.getstr(), '&', 0, 0, ID_SICONVERT,
  371.         NM_ITEM,  0, cat.msgInverse.getstr(),   '/', 0, 0, ID_INVERSE,
  372.         NM_ITEM,  0, cat.msgShowFormula.getstr(),'=',0, 0, ID_SHOWFORMULA,
  373.         NM_ITEM,  0, cat.msgSwitch.getstr(),     0, 0, 0, ID_SWITCH,
  374.         NM_ITEM,  0, NM_BARLABEL,                0,  0, 0, 0,
  375.         NM_ITEM, 0,cat.msgNoConversion.getstr(),'B',CHECKIT,0,ID_MNU_NOCONVERT,
  376.         NM_ITEM,  0, cat.msgPlus.getstr(),      '+', 0, 0, ID_MNU_ADD,
  377.         NM_ITEM,  0, cat.msgSubstr.getstr(),    '-', 0, 0, ID_MNU_SUBSTR,
  378.  
  379.     NM_TITLE,0,cat.msgUnitData.getstr(),0,0,0,0,
  380.         NM_ITEM, 0, cat.msgSI.getstr(),          0,  0, 0, 0,
  381.            NM_SUB,0,cat.msgAddSI.getstr(),       0,  0, 0, ID_SADD,
  382.         NM_ITEM, 0, cat.msgBase.getstr(),        0,  0, 0, 0,
  383.            NM_SUB,0,cat.msgAddB.getstr(),        0,  0, 0, ID_BADD,
  384.            NM_SUB,0,cat.msgDeleteB.getstr(),     0,  0, 0, ID_BDEL,
  385.            NM_SUB,0,cat.msgSetZero.getstr(),     0,  0, 0, ID_SETZERO,
  386.            NM_SUB,0,cat.msgRenameB.getstr(),     0,  0, 0, ID_BRENAME,
  387.         NM_ITEM, 0, cat.msgComposed.getstr(),    0,  0, 0, 0,
  388.            NM_SUB,0,cat.msgAddC.getstr(),        0,  0, 0, ID_CADD,
  389.            NM_SUB,0,cat.msgDeleteC.getstr(),     0,  0, 0, ID_CDEL,
  390.            NM_SUB,0,cat.msgRenameC.getstr(),     0,  0, 0, ID_CRENAME,
  391.         NM_ITEM, 0, cat.msgGroup.getstr(),       0,  0, 0, 0,
  392.  
  393.            NM_SUB,0,cat.msgAddG.getstr(),        0,  0, 0, ID_GADD,
  394.            NM_SUB,0,cat.msgDeleteG.getstr(),     0,  0, 0, ID_GDEL,
  395.            NM_SUB,0,cat.msgRenameG.getstr(),     0,  0, 0, ID_GRENAME,
  396.            NM_SUB,0,cat.msgSortGroups.getstr(), 'G', 0, 0, ID_GSORT,
  397.         NM_ITEM, 0, cat.msgSort.getstr(),        0,  0, 0, 0,
  398.            NM_SUB,0,cat.msgAlphabetically.getstr(),'F',0, 0, ID_ASORT,
  399.            NM_SUB,0,cat.msgNumerically.getstr(),'M', 0, 0, ID_NSORT,
  400.            NM_SUB,0,cat.msgReverse.getstr(),    'X', 0, 0, ID_RSORT,
  401.         NM_ITEM, 0, NM_BARLABEL,                 0,  0, 0, 0,
  402.         NM_ITEM, 0, cat.msgNew.getstr(),        'N', 0, 0, ID_NEWUD,
  403.         NM_ITEM, 0, cat.msgLoad.getstr(),       'L', 0, 0, ID_LOADUD,
  404.         NM_ITEM, 0, cat.msgLoadFrom.getstr(),   'O', 0, 0, ID_LOADFROM,
  405.         NM_ITEM, 0, cat.msgSave.getstr(),       'S', 0, 0, ID_UDSAVE,
  406.         NM_ITEM, 0, cat.msgSaveAs.getstr(),     'A', 0, 0, ID_SAVEAS,
  407.         NM_ITEM, 0, cat.msgAboutUDT.getstr(),   'U', 0, 0, ID_ABOUTUD,
  408.  
  409.     NM_TITLE,0,cat.msgHelp.getstr(),0,0,0,0,
  410.         NM_ITEM, 0, cat.msgHelpContents.getstr(),'H',0, 0, ID_HCONT,
  411.         NM_ITEM, 0, cat.msgSBC.getstr(),         'T',0, 0, ID_HSBC,
  412.         NM_ITEM, 0, cat.msgHelpBubbles.getstr(), 'I',CHECKIT,0,ID_BUBBLES,
  413.  
  414.     NM_END,0,NIL,0,0,0,0]:newmenu
  415.  
  416.     muimasterbase:=OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN)
  417.     IF muimasterbase <> NIL
  418.  
  419.         IF initclasses()=NIL THEN
  420.             Raise(ER_NOCLASSES)
  421.  
  422.         lvt_pfx:=['Y (+24)','Z (+21)',
  423.                   'E (+18)','P (+15)',
  424.                   'T (+12)','G  (+9)',
  425.                   'M  (+6)','K  (+3)',
  426.                   'H  (+2)','Da (+1)',
  427.                   cat.msgOriginal.getstr(),                
  428.                   '    (0)','d  (-1)',
  429.                   'c  (-2)','m  (-3)',
  430.                   'µ  (-6)','n  (-9)',
  431.                   'p (-12)','f (-15)',
  432.                   'a (-18)','z (-21)',
  433.                   'y (-24)', NIL]
  434.  
  435.         app:=appstruct()
  436.  
  437.         IF app<>NIL
  438.             set(ug,MUIA_UserData,OBJ_COMPF)
  439.             set(ud,MUIA_UserData,OBJ_COMPF)
  440.             set(vg,MUIA_UserData,OBJ_BASEF)
  441.             set(vd,MUIA_UserData,OBJ_BASEF)
  442.             set(l_units,MUIA_UserData,OBJ_COMPL)
  443.  
  444.             initC()
  445.             loadud()
  446.  
  447. /*Close windows*/
  448.             doMethodA(window,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit])
  449.             doMethodA(strwin,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,strwin,3,MUIM_Set,MUIA_Window_Open,FALSE])
  450.             doMethodA(strstr,[MUIM_Notify,MUIA_String_Acknowledge, MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_STRDONE])
  451. /*×÷= buttons*/
  452.             doMethodA(bt_a,  [MUIM_Notify,MUIA_Selected,MUI_TRUE,bt_b,3,MUIM_NoNotifySet,MUIA_Selected,FALSE])
  453.             doMethodA(bt_a,  [MUIM_Notify,MUIA_Selected,MUI_TRUE,bt_c,3,MUIM_NoNotifySet,MUIA_Selected,FALSE])
  454.             doMethodA(bt_b,  [MUIM_Notify,MUIA_Selected,MUI_TRUE,bt_a,3,MUIM_NoNotifySet,MUIA_Selected,FALSE])
  455.             doMethodA(bt_b,  [MUIM_Notify,MUIA_Selected,MUI_TRUE,bt_c,3,MUIM_NoNotifySet,MUIA_Selected,FALSE])
  456.             doMethodA(bt_c,  [MUIM_Notify,MUIA_Selected,MUI_TRUE,bt_a,3,MUIM_NoNotifySet,MUIA_Selected,FALSE])
  457.             doMethodA(bt_c,  [MUIM_Notify,MUIA_Selected,MUI_TRUE,bt_b,3,MUIM_NoNotifySet,MUIA_Selected,FALSE])
  458.             doMethodA(bt_a,  [MUIM_Notify,MUIA_Selected,FALSE,bt_a,3,MUIM_NoNotifySet,MUIA_Selected,MUI_TRUE])
  459.             doMethodA(bt_b,  [MUIM_Notify,MUIA_Selected,FALSE,bt_b,3,MUIM_NoNotifySet,MUIA_Selected,MUI_TRUE])
  460.             doMethodA(bt_c,  [MUIM_Notify,MUIA_Selected,FALSE,bt_c,3,MUIM_NoNotifySet,MUIA_Selected,MUI_TRUE])
  461. /*Cycle Chain*/
  462.             doMethodA(window, [MUIM_Window_SetCycleChain, ug,ud,vg,vd,bt_a,bt_b,bt_c,accu,ld,lv_groups,lv_pfx,lv_units,NIL])
  463. /*Strings, Slider, Radio..*/
  464.             doMethodA(ug,    [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_LEFTU])
  465.             doMethodA(ud,    [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_RIGHTU])
  466.             doMethodA(vg,    [MUIM_Notify,MUIA_String_Contents,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_CALCR])
  467.             doMethodA(vd,    [MUIM_Notify,MUIA_String_Contents,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_CALCL])
  468.             doMethodA(vg,    [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_WRITE])
  469.             doMethodA(vd,    [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_WRITE])
  470.             doMethodA(accu,  [MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_CALC])
  471.             doMethodA(ld,    [MUIM_Notify,MUIA_Radio_Active,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_CALC])
  472. /*lists*/
  473.             doMethodA(l_groups,[MUIM_Notify,MUIA_List_Active,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_OPENG])
  474.             doMethodA(lv_units,[MUIM_Notify,MUIA_Listview_DoubleClick,MUI_TRUE,app,2,MUIM_Application_ReturnID,ID_READU])
  475. /*shortkeys*/
  476.             doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'space',    app,2,MUIM_Application_ReturnID,ID_SWITCH])
  477.             doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'s',        app,2,MUIM_Application_ReturnID,ID_SADD])
  478.             doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'b',        app,2,MUIM_Application_ReturnID,ID_BADD])
  479.             doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'control b',app,2,MUIM_Application_ReturnID,ID_BDEL])
  480.             doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'shift b',  app,2,MUIM_Application_ReturnID,ID_BRENAME])
  481.             doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'alt b',    app,2,MUIM_Application_ReturnID,ID_SETZERO])
  482.             doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'c',        app,2,MUIM_Application_ReturnID,ID_CADD])
  483.             doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'control c',app,2,MUIM_Application_ReturnID,ID_CDEL])
  484.             doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'shift c',  app,2,MUIM_Application_ReturnID,ID_CRENAME])
  485.             doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'g',        app,2,MUIM_Application_ReturnID,ID_GADD])
  486.             doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'control g',app,2,MUIM_Application_ReturnID,ID_GDEL])
  487.             doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'shift g',  app,2,MUIM_Application_ReturnID,ID_GRENAME])
  488.  
  489.             set(l_pfx,MUIA_List_Active,10)
  490.             set(l_groups,MUIA_List_Active,0)
  491.  
  492.             set(window,MUIA_Window_Open,MUI_TRUE)
  493.  
  494.             running := TRUE
  495.  
  496.             WHILE running
  497.                 result:= doMethodA(app, [MUIM_Application_Input,{sigs} ])
  498.  
  499.                 SELECT result
  500.                     CASE MUIV_Application_ReturnID_Quit
  501.                         running:=FALSE
  502.                     CASE ID_MNU_NOCONVERT
  503.                         noconvert:=1-noconvert
  504.                         IF noconvert THEN convert()
  505.                     CASE ID_MNU_ADD
  506.                         mget(vd,MUIA_String_Contents,{a})
  507.                         undef2:=supera2d(a,value2)
  508.                         mget(vg,MUIA_String_Contents,{a})
  509.                         undef1:=supera2d(a,value1)
  510.                         IF rightt()
  511.                             IF StrCmp(type1,type2)
  512.                                 dAdd(dDiv(dMul(value1,fact1,s),fact2,s),value2,value2)
  513.                                 mget(accu,MUIA_Slider_Level,{cur})
  514.                                 float2str(str,value2,cur)
  515.                                 undef2:=FALSE
  516.                             ELSE
  517.                                 StrCopy(str,'***')
  518.                                 undef2:=TRUE
  519.                             ENDIF
  520.                             doMethodA(vd,[MUIM_NoNotifySet,MUIA_String_Contents,str])
  521.                         ELSE
  522.                             IF StrCmp(type1,type2)
  523.                                 dAdd(dDiv(dMul(value2,fact2,s),fact1,s),value1,value1)
  524.                                 mget(accu,MUIA_Slider_Level,{cur})
  525.                                 float2str(str,value1,cur)
  526.                                 undef1:=FALSE
  527.                             ELSE
  528.                                 StrCopy(str,'***')
  529.                                 undef1:=TRUE
  530.                             ENDIF
  531.                             doMethodA(vg,[MUIM_NoNotifySet,MUIA_String_Contents,str])
  532.                         ENDIF
  533.                         savelast()
  534.                     CASE ID_MNU_SUBSTR
  535.                         mget(vd,MUIA_String_Contents,{a})
  536.                         undef2:=supera2d(a,value2)
  537.                         mget(vg,MUIA_String_Contents,{a})
  538.                         undef1:=supera2d(a,value1)
  539.                         IF rightt()
  540.                             IF StrCmp(type1,type2)
  541.                                 dSub(value2,dDiv(dMul(value1,fact1,s),fact2,s),value2)
  542.                                 mget(accu,MUIA_Slider_Level,{cur})
  543.                                 float2str(str,value2,cur)
  544.                                 undef2:=FALSE
  545.                             ELSE
  546.                                 StrCopy(str,'***')
  547.                                 undef1:=TRUE
  548.                             ENDIF
  549.                             doMethodA(vd,[MUIM_NoNotifySet,MUIA_String_Contents,str])
  550.                         ELSE
  551.                             IF StrCmp(type1,type2)
  552.                                 dSub(value1,dDiv(dMul(value2,fact2,s),fact1,s),value1)
  553.                                 mget(accu,MUIA_Slider_Level,{cur})
  554.                                 float2str(str,value1,cur)
  555.                                 undef1:=FALSE
  556.                             ELSE
  557.                                 StrCopy(str,'***')
  558.                                 undef2:=TRUE
  559.                             ENDIF
  560.                             doMethodA(vg,[MUIM_NoNotifySet,MUIA_String_Contents,str])
  561.                         ENDIF
  562.                         savelast()
  563.                     CASE ID_SICONVERT
  564.                         IF rightt()
  565.                             ptr:=unit2
  566.                             ptr.siConvert(value2) /*ptr and value2 changed, they must be put to screen*/
  567.                             unit2.comp2str()
  568.                             set(ud,MUIA_String_Contents,str)
  569.                             float2str(str,value2)
  570.                             set(vd,MUIA_String_Contents,str)
  571.                             dCopy(fact2,t)
  572.                         ELSE
  573.                             ptr:=unit1
  574.                             ptr.siConvert(value1)
  575.                             unit1.comp2str()
  576.                             set(ug,MUIA_String_Contents,str)
  577.                             float2str(str,value1)
  578.                             set(vg,MUIA_String_Contents,str)
  579.                             dCopy(fact1,t)
  580.                         ENDIF
  581.                         savelast()
  582.                     CASE ID_UNDO
  583. /*UUUU*RRRRR*/          IF current=0
  584. /*    |     */              StringF(r,'\s:\s',cat.msgTools.getstr(),cat.msgUnDo.getstr())
  585. /*   _V     */              Mui_RequestA(app,window,0,r,NIL,cat.msgNoUndo.getstr(),NIL)
  586. /*UUU*RRRRRR*/          ELSE
  587. /*   ¯      */              current--
  588.                             IF (un:=undo.getitem(current))=NIL
  589.                                 StringF(r,'\s:\s',cat.msgTools.getstr(),cat.msgUnDo.getstr())
  590.                                 Mui_RequestA(app,window,0,r,NIL,cat.msgNoUndo.getstr(),NIL)
  591.                                 current++
  592.                             ELSE
  593.                                 unit1.copycomp(un.u1)
  594.                                 unit2.copycomp(un.u2)
  595.                                 dCopy(value1,un.v1)
  596.                                 dCopy(value2,un.v2)
  597.  
  598.                                 unit1.comp2str()
  599.                                 nnset(ug,MUIA_String_Contents,str)
  600.                                 float2str(str,value1)
  601.                                 nnset(vg,MUIA_String_Contents,str)
  602.                                 unit1.getinfo(fact1,zero1,type1)
  603.  
  604.                                 unit2.comp2str()
  605.                                 nnset(ud,MUIA_String_Contents,str)
  606.                                 float2str(str,value2)
  607.                                 nnset(vd,MUIA_String_Contents,str)
  608.                                 unit2.getinfo(fact2,zero2,type2)
  609.                             ENDIF
  610.                         ENDIF
  611. /*UUUU*RRRRR*/      CASE ID_REDO
  612. /*    |     */          IF current=(undosteps-1)
  613. /*    V_    */              StringF(r,'\s:\s',cat.msgTools.getstr(),cat.msgReDo.getstr())
  614. /*UUUUU*RRRR*/              Mui_RequestA(app,window,0,r,NIL,cat.msgNoRedo.getstr(),NIL)
  615. /*     ¯    */          ELSE
  616.                             current++
  617.                             un:=undo.getitem(current)
  618.                             unit1.copycomp(un.u1)
  619.                             unit2.copycomp(un.u2)
  620.                             dCopy(value1,un.v1)
  621.                             dCopy(value2,un.v2)
  622.  
  623.                             unit1.comp2str()
  624.                             nnset(ug,MUIA_String_Contents,str)
  625.                             float2str(str,value1)
  626.                             nnset(vg,MUIA_String_Contents,str)
  627.                             unit1.getinfo(fact1,zero1,type1)
  628.  
  629.                             unit2.comp2str()
  630.                             nnset(ud,MUIA_String_Contents,str)
  631.                             float2str(str,value2)
  632.                             nnset(vd,MUIA_String_Contents,str)
  633.                             unit2.getinfo(fact2,zero2,type2)
  634.                         ENDIF
  635.                     CASE ID_SETZERO
  636.                         mget(l_units,MUIA_List_Active,{n})
  637.                         IF n <> MUIV_List_Active_Off
  638.                             IF basegroup
  639.                                 bptr:=bases[n]
  640.                                 float2str(str,bptr.zero)
  641.                                 askstr(cat.msgSetZero.getstr(),str,NUMERIC)
  642.                             ELSE
  643.                                 mget(l_groups,MUIA_List_Active,{cur})
  644.                                 gptr:=groups[cur]
  645.                                 ptr:=gptr.list[n]
  646.                                 IF ptr.simple()
  647.                                     strarg,n:=findbase(ptr.base[])
  648.                                     IF n=FALSE
  649.                                         bptr:=bases[strarg]
  650.                                         float2str(str,bptr.zero)
  651.                                         askstr(cat.msgSetZero.getstr(),str,NUMERIC)
  652.                                     ENDIF
  653.                                 ELSE
  654.                                     Mui_RequestA(app,window,0,cat.msgZeroVsCplxT.getstr(),NIL,cat.msgZeroVsCplx.getstr(),NIL)
  655.                                 ENDIF
  656.                             ENDIF
  657.                         ENDIF
  658.                     CASE ID_ABOUTUD
  659.                         doMethodA(l_groups,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{a}])
  660.                         StringF(longstr,'\s\n' +
  661.                                         '* \d \s\n' +
  662.                                         '* \d \s\n' +
  663.                                         '* \d \s.\n' +
  664.                                         '\s, ''\s'', \s\n' +
  665.                                         '\d \s.',cat.msgAboutUD.getstr(),nbases+1,cat.msgBaseUnits.getstr(),
  666.                                                  glen+2,cat.msgGroups.getstr(),nsi+1,cat.msgSItypes.getstr(),
  667.                                                  cat.msgTheCGA.getstr(),a,cat.msgTheCGB.getstr(),nunits+1,cat.msgComposedUnits.getstr())
  668.                         Mui_RequestA(app,window,0,cat.msgAboutUDT.getstr(),NIL,longstr,NIL)
  669.  
  670.                     CASE ID_SHOWFORMULA
  671.                         StringF(longstr,'\s ',cat.msgReqToConvert.getstr())
  672.                         mget(ug,MUIA_String_Contents,{q})
  673.                         StrAdd(longstr,q);StrAdd(longstr,cat.msgReqInto.getstr())
  674.                         StrAdd(longstr,' ') ->How can we put spaces at the end of a catalog string?
  675.                         mget(ud,MUIA_String_Contents,{q})
  676.                         StrAdd(longstr,q);StrAdd(longstr,':')
  677.                         IF dCompare(dFloat(1,s),dDiv(fact1,fact2,t))
  678.                             IF dFix(t)=0
  679.                                 dDiv(s,t,t)
  680.                                 StrAdd(longstr,'\n')
  681.                                 StrAdd(longstr,cat.msgReqDivide.getstr())
  682.                                 StrAdd(longstr,' ')
  683.                             ELSE
  684.                                 StrAdd(longstr,'\n')
  685.                                 StrAdd(longstr,cat.msgReqMultiply.getstr())
  686.                                 StrAdd(longstr,' ')
  687.                             ENDIF
  688.                             float2str(r,t,13)
  689.                             StrAdd(longstr,r)
  690.                         ENDIF
  691.  
  692.                         IF dCompare(dFloat(0,s),dDiv(dSub(zero1,zero2,t),fact2,t))
  693.                             IF dFix(t)<0
  694.                                 StrAdd(longstr,'\n')
  695.                                 StrAdd(longstr,cat.msgReqSubstract.getstr())
  696.                                 StrAdd(longstr,' ')
  697.                                 dSub(s,t,t)
  698.                             ELSE
  699.                                 StrAdd(longstr,'\n')
  700.                                 StrAdd(longstr,cat.msgReqAdd.getstr())
  701.                                 StrAdd(longstr,' ')
  702.                             ENDIF
  703.                             float2str(r,t,13)
  704.                             StrAdd(longstr,r)
  705.                         ENDIF
  706.  
  707.                         Mui_RequestA(app,window,0,cat.msgShowFormula.getstr(),NIL,longstr,NIL)
  708.                     CASE ID_SADD
  709.                         askstr(cat.msgEnterSi.getstr(),'',BASE)
  710.                     CASE ID_GADD
  711.                         askstr(cat.msgNewGroup.getstr(),'',GROUP)
  712.                     CASE ID_GSORT
  713.                         gsort()
  714.                         doMethodA(l_groups,[MUIM_List_Remove,glen+1])
  715.                         doMethodA(l_groups,[MUIM_List_Sort])
  716.                         doMethodA(l_groups,[MUIM_List_InsertSingle,cat.msgBase.getstr(),glen+1])
  717.                         _returnid(ID_OPENG)
  718.                     CASE ID_ASORT
  719.                         IF basegroup
  720.                             bsort(SR_ALPHA)
  721.                         ELSE
  722.                             mget(l_groups,MUIA_List_Active,{cur})
  723.                             csort(SR_ALPHA,cur)
  724.                         ENDIF
  725.                         _returnid(ID_OPENG)
  726.                     CASE ID_NSORT
  727.                         IF basegroup
  728.                             bsort(SR_NUMERIC)
  729.                         ELSE
  730.                             mget(l_groups,MUIA_List_Active,{cur})
  731.                             csort(SR_NUMERIC,cur)
  732.                         ENDIF
  733.                         _returnid(ID_OPENG)
  734.                     CASE ID_RSORT       ->Revert
  735.                         IF basegroup
  736.                             IF Even(nbases)
  737.                                 z:=nbases/2-1
  738.                             ELSE
  739.                                 z:=(nbases-3)/2
  740.                             ENDIF
  741.                             FOR i:=0 TO z
  742.                                 cur:=bases[nbases-i]
  743.                                 bases[nbases-i]:=bases[i]
  744.                                 bases[i]:=cur
  745.                             ENDFOR
  746.                         ELSE
  747.                             mget(l_groups,MUIA_List_Active,{cur})
  748.                             gptr:=groups[cur]
  749.                             IF Odd(gptr.sze)       -> Not the amount of object but the number of the last!
  750.                                 z:=(gptr.sze-1)/2
  751.                             ELSE
  752.                                 z:=(gptr.sze-2)/2
  753.                             ENDIF
  754.                             FOR i:=0 TO z
  755.                                 cur:=gptr.list[gptr.sze-i]
  756.                                 gptr.list[gptr.sze-i]:=gptr.list[i]
  757.                                 gptr.list[i]:=cur
  758.                             ENDFOR
  759.                         ENDIF
  760.                         _returnid(ID_OPENG)
  761.                     CASE ID_CADD
  762.                         IF basegroup
  763.                             Mui_RequestA(app,window,0,cat.msgCompVsBgT.getstr(),NIL,cat.msgCompVsBg.getstr(),NIL)
  764.                         ELSE
  765.                             mget(l_groups,MUIA_List_Active,{cur})
  766.                             IF rightt()
  767.                                 addcomp(cur,unit2,0)
  768.                             ELSE
  769.                                 addcomp(cur,unit1,0)
  770.                             ENDIF
  771.                         ENDIF
  772.                     CASE ID_CDEL
  773.                         IF basegroup
  774.                             mget(l_units,MUIA_List_Active,{n})
  775.                             z:=Mui_RequestA(app,window,0,cat.msgDCompvBsT.getstr(),cat.msgDCompvBsB.getstr(),
  776.                                 cat.msgDCompvBs.getstr(),
  777.                                 NIL)
  778.                             bptr:=bases[n]
  779.                             StrCopy(r,bptr.name)
  780.                             n:=0
  781.                             IF z=1
  782.                                 FOR cur:=0 TO glen
  783.                                     gptr:=groups[cur]
  784.                                     FOR i:=0 TO gptr.sze
  785.                                         ptr:=gptr.list[i]
  786.                                         line:=FALSE                     /*line is true if groups[cur].list[i]*/
  787.                                         FOR o:=0 TO ptr.sze             /*must be deleted*/
  788.                                             IF StrCmp(ptr.base[o],r)
  789.                                                 line:=TRUE
  790.                                             ENDIF
  791.                                         ENDFOR
  792.                                         IF line=TRUE
  793.                                             n++
  794.                                         ENDIF
  795.                                     ENDFOR
  796.                                 ENDFOR
  797.                                 StringF(longstr,'\s \d \s \s \s \d \s',cat.msgCountResultA.getstr(),n,cat.msgCountResultB.getstr(),r,cat.msgCountResultC.getstr(),n,cat.msgCountResultD.getstr())
  798.                                 z:=Mui_RequestA(app,window,0,cat.msgDCompvBsT.getstr(),cat.msgDCompvBsB2.getstr(),longstr,
  799.                                      NIL)+1 /*Le "count" a disparu*/
  800.                             ENDIF
  801.  
  802.                             IF (z=2) ->Efface les composées
  803.                                 FOR cur:=0 TO glen
  804.                                     n:=0 ->Décalage si une unité est supprimée
  805.                                     gptr:=groups[cur]
  806.                                     FOR i:=0 TO gptr.sze
  807.                                         ptr:=gptr.list[i-n]
  808.                                         line:=FALSE
  809.                                         FOR o:=0 TO ptr.sze
  810.                                             IF StrCmp(ptr.base[o],r)
  811.                                                 line:=TRUE
  812.                                             ENDIF
  813.                                         ENDFOR
  814.                                         IF line=TRUE
  815.                                             IF delcomp(cur,i-n) THEN cur--
  816.                                             n++
  817.                                         ENDIF
  818.                                     ENDFOR
  819.                                 ENDFOR
  820.                             ENDIF
  821.                             IF (z=2) OR (z=3) ->Efface la base
  822.                                 mget(l_units,MUIA_List_Active,{n})
  823.                                 IF n <> MUIV_List_Active_Off THEN delbase(n)
  824.                             ENDIF
  825.  
  826.                         ELSE
  827.                             /*Delete the composed unit n°i of the group cur*/
  828.                             mget(l_units,MUIA_List_Active,{i})
  829.                             IF i <> MUIV_List_Active_Off
  830.                                 mget(l_groups,MUIA_List_Active,{cur})
  831.                                 doMethodA(l_units,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{q}])
  832.                                 StringF(r,'*\s|\s',cat.msgYes.getstr(),cat.msgNo.getstr())
  833.                                 StringF(longstr,'\s\n\ec\s ?',cat.msgChkDelUnit.getstr(),q)
  834.                                 IF Mui_RequestA(app,window,0,cat.msgDCU.getstr(),r,longstr,NIL)=1
  835.                                     IF Not(delcomp(cur,i)) THEN
  836.                                         doMethodA(l_units,[MUIM_List_Remove,i])
  837.                                 ENDIF
  838.                             ENDIF
  839.                         ENDIF
  840.                     CASE ID_BADD
  841.                         mget(l_groups,MUIA_List_Active,{cur})
  842.  
  843.                         askstr(cat.msgBaseName.getstr(),'',BASE)
  844.                         strarg:=0
  845.                         IF rightt()
  846.                             strarg2:=FALSE
  847.                         ELSE
  848.                             strarg2:=TRUE
  849.                         ENDIF
  850.                     CASE ID_BDEL
  851.                         mget(l_units,MUIA_List_Active,{i})
  852.                         IF i <> MUIV_List_Active_Off
  853.                             IF basegroup
  854.                                 StringF(r,'*\s|\s',cat.msgYes.getstr(),cat.msgNo.getstr())
  855.                                 IF Mui_RequestA(app,window,0,cat.msgDBU.getstr(),r,cat.msgChkDelBase.getstr(),NIL)=1
  856.                                     delbase(i)
  857.                                     doMethodA(l_units,[MUIM_List_Remove,i])
  858.                                 ENDIF
  859.                             ELSE
  860.                                 mget(l_groups,MUIA_List_Active,{cur})
  861.                                 gptr:=groups[cur]
  862.                                 ptr:=gptr.list[i]
  863.                                 StrCopy(longstr,cat.msgDeleteBaseVsC.getstr())
  864.                                 IF ptr.sze <> 0
  865.                                     StrAdd(longstr,cat.msgDeleteBaseVsC2.getstr())
  866.                                 ELSE
  867.                                     StrAdd(longstr,cat.msgDeleteBaseVsC3.getstr())
  868.                                 ENDIF
  869.  
  870.                                 FOR i:=0 TO ptr.sze
  871.                                     StrAdd(longstr,'\n<')
  872.                                     StrAdd(longstr,ptr.base[i])
  873.                                     StrAdd(longstr,'>')
  874.                                 ENDFOR
  875.                                 z:=Mui_RequestA(app,window,0,cat.msgDeleteBaseVsCT.getstr(),cat.msgDeleteBaseVsCB.getstr(),longstr,NIL)
  876.                                 IF (z=2)            ->Delete bases
  877.                                     FOR i:=0 TO ptr.sze
  878.                                         /*Supprime la base ptr.base[i]*/
  879.                                         cur:=findbase(ptr.base[i])
  880.                                         delbase(cur)
  881.                                     ENDFOR
  882.                                 ENDIF
  883.                                 IF (z=1) OR (z=2)   ->Delete composed
  884.                                     mget(l_groups,MUIA_List_Active,{cur})
  885.                                     mget(l_units,MUIA_List_Active,{i})
  886.                                     IF Not(delcomp(cur,i)) THEN
  887.                                         doMethodA(l_units,[MUIM_List_Remove,i])
  888.                                 ENDIF
  889.                             ENDIF
  890.                         ENDIF
  891.                     CASE ID_BRENAME
  892.                         i:=TRUE
  893.                         mget(l_units,MUIA_List_Active,{strarg})
  894.                         IF strarg <> MUIV_List_Active_Off
  895.                             doMethodA(l_units,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{q}])
  896.                             IF basegroup
  897.                                 StrCopy(str,cat.msgBase.getstr())
  898.                                 StrAdd(str,':')
  899.                                 StrAdd(str,cat.msgRename.getstr())
  900.                                 StringF(r,'*\s|\s',cat.msgYes.getstr(),cat.msgNo.getstr())
  901.                                 IF Mui_RequestA(app,window,0,str,r,cat.msgChkRenameBase.getstr(),NIL)=1
  902.                                     set(strwin,MUIA_Window_Title,cat.msgRenameBase.getstr())
  903.                                 ELSE                                            
  904.                                     i:=FALSE
  905.                                 ENDIF
  906.                             ELSE
  907.                                 NEW ptr
  908.                                 IF ptr.decode(OP_REPL,q) = FALSE
  909.                                     Mui_RequestA(app,window,0,cat.msgInternalFailureT.getstr(),NIL,cat.msgInternalFailure.getstr(),NIL)
  910.                                     JUMP out
  911.                                 ENDIF
  912.                                 IF ptr.sze<>0
  913.                                     Mui_RequestA(app,window,0,cat.msgBaseVsComposed.getstr(),NIL,cat.msgUseComposed.getstr(),NIL)
  914.                                     i:=FALSE
  915.                                 ELSE
  916.                                     StringF(r,'*\s|\s',cat.msgYes.getstr(),cat.msgNo.getstr())
  917.                                     IF Mui_RequestA(app,window,0,cat.msgBaseVsComposed.getstr(),r,cat.msgChkRenameBoth.getstr(),NIL) = 1
  918.                                         set(strwin,MUIA_Window_Title,cat.msgRenameBoth.getstr())
  919.                                     ELSE
  920.                                         i:=FALSE
  921.                                     ENDIF
  922.                                 ENDIF
  923.                             ENDIF
  924.                             IF i
  925.                                 set(strstr,MUIA_String_Contents,q)
  926.                                 set(strwin,MUIA_Window_Open,MUI_TRUE)
  927.                             ENDIF
  928.                         ENDIF
  929.                     CASE ID_GRENAME
  930.                         doMethodA(l_groups,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{q}])
  931.                         askstr(cat.msgChkRenameGroup.getstr(),q,GROUP)
  932.                         mget(l_groups,MUIA_List_Active,{z})
  933.                         strarg:=z
  934.                     CASE ID_CRENAME
  935.                         mget(l_units,MUIA_List_Active,{strarg})
  936.                         IF strarg <> MUIV_List_Active_Off
  937.                             doMethodA(l_units,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{q}])
  938.                             askstr(cat.msgChkChangeComposed.getstr(),q,COMPOSED)
  939.                         ENDIF
  940.                     CASE ID_GDEL
  941.                         mget(l_groups,MUIA_List_Active,{cur})
  942.                         IF (cur = (glen+1)) OR (glen=0)
  943.                             bip()
  944.                             JUMP out
  945.                         ENDIF
  946.                         doMethodA(l_groups,[MUIM_List_Remove,cur])
  947.                         FOR i:=cur TO glen-1
  948.                             groups[i]:=groups[i+1]
  949.                         ENDFOR
  950.                         glen--
  951. /* ici: STR DONE */ CASE ID_STRDONE
  952.                         set(strwin,MUIA_Window_Open,FALSE)
  953.                         mget(strwin,MUIA_Window_Title,{q})
  954.                         IF StrCmp(q,cat.msgNewGroup.getstr())
  955.                             mget(strstr,MUIA_String_Contents,{q})
  956.                             IF badgroup(q) THEN JUMP out
  957.                             glen++
  958.                             NEW ptr
  959.                             NEW gptr
  960.                             groups[glen]:=gptr
  961.                             gptr.list:=NewR(50*4)
  962.                             IF rightt()
  963.                                 ptr.copycomp(unit2,NEWC)
  964.                             ELSE
  965.                                 ptr.copycomp(unit1,NEWC)
  966.                             ENDIF
  967.                             gptr.list[]:=ptr
  968.                             gptr.title:=String(StrLen(q))
  969.                             StrCopy(gptr.title,q)
  970.                             gptr.sze:=0
  971.                             r:=String(StrLen(q))
  972.                             StrCopy(r,q)
  973.  
  974.                             doMethodA(l_groups,[MUIM_List_InsertSingle,r,glen])
  975.                             r:=String(50)
  976.                             doMethodA(l_groups,[MUIM_Set,MUIA_List_Active,glen])
  977.                         ELSEIF StrCmp(q,cat.msgEnterSi.getstr())
  978.                             IF nsi>19
  979.                                 Mui_RequestA(app,window,0,cat.msgCreateSiT.getstr(),NIL,cat.msgNoSI.getstr(),NIL)
  980.                             ELSE
  981.                                 mget(strstr,MUIA_String_Contents,{q})
  982.                                 IF badbase(q) THEN JUMP out
  983.                                 StringF(longstr,'\s \s \s',cat.msgCreateSi1.getstr(),q,cat.msgCreateSi2.getstr())
  984.                                 i:=Mui_RequestA(app,window,0,cat.msgCreateSiT.getstr(),cat.msgCreateSiB.getstr(),longstr,NIL)
  985.                                 IF (i=1) OR (i=2) OR (i=3)  -> Create Base
  986.                                     nsi++
  987.                                     NEW ptr
  988.                                     ptr.createsimple(q)
  989.                                     si[nsi]:=ptr
  990.                                     addbase(dFloat(1,s),-nsi,q)
  991.                                 ENDIF
  992.                                 IF (i=2)                    -> Create Composed
  993.                                     mget(l_groups,MUIA_List_Active,{cur})
  994.                                     addcomp(cur,ptr,0)
  995.                                 ENDIF
  996.                                 IF (i=1)                    -> Create Group
  997.                                     savelast()
  998.                                     IF rightt()
  999.                                         unit2.copycomp(ptr)
  1000.                                     ELSE
  1001.                                         unit1.copycomp(ptr)
  1002.                                     ENDIF
  1003.                                     askstr(cat.msgNewGroup.getstr(),'',GROUP)
  1004.                                 ENDIF
  1005.                             ENDIF
  1006.                             savelast()
  1007.                         ELSEIF StrCmp(q,cat.msgBaseName.getstr())
  1008.                             mget(strstr,MUIA_String_Contents,{q})
  1009.                             IF badbase(q) THEN JUMP out
  1010.                             IF basegroup
  1011.                                 /*Créer Base*/
  1012.                                 IF strarg2 ->Gauche?
  1013.                                     addbase(value1,unit1,q,strarg)
  1014.                                 ELSE
  1015.                                     addbase(value2,unit2,q,strarg)
  1016.                                 ENDIF
  1017.                             ELSE
  1018.                                 /*Créer Composée aussi*/
  1019.                                 mget(l_groups,MUIA_List_Active,{cur})
  1020.                                 i:=strarg                               /*cur:Groupe*/
  1021.                                 NEW ptr                                 /*i:NComp.  */
  1022.                                 ptr.createsimple(q)                     /*q:Nom     */
  1023.                                 IF strarg2 ->Gauche?
  1024.                                     IF addbase(value1,unit1,q) THEN addcomp(cur,ptr,i)
  1025.                                 ELSE ->Droite?
  1026.                                     IF addbase(value2,unit2,q) THEN addcomp(cur,ptr,i)
  1027.                                 ENDIF
  1028.                             ENDIF
  1029.                         ELSEIF StrCmp(q,cat.msgSetZero.getstr())
  1030.                             mget(strstr,MUIA_String_Contents,{q})
  1031.                             bptr:=bases[strarg]
  1032.                             supera2d(q,bptr.zero)
  1033.                         ELSEIF StrCmp(q,cat.msgChkRenameGroup.getstr())
  1034.                             mget(strstr,MUIA_String_Contents,{q})
  1035.                             IF badgroup(q) THEN JUMP out
  1036.                             gptr:=groups[strarg]
  1037.                             StrCopy(gptr.title,q)
  1038.                             replace(l_groups,strarg,q)
  1039.                             ->StrCopy(lvt_groups[strarg],q)
  1040.                             ->doMethod(l_groups,[MUIM_List_Redraw,strarg])
  1041.                         ELSEIF StrCmp(q,cat.msgRenameBase.getstr())
  1042.                             mget(strstr,MUIA_String_Contents,{q})
  1043.                             IF badbase(q) THEN JUMP out
  1044.                             replace(l_units,strarg,q)
  1045.                             bptr:=bases[strarg]
  1046.                             DisposeLink(bptr.name)
  1047.                             bptr.name:=String(StrLen(q))
  1048.                             StrCopy(bptr.name,q)
  1049.                         ELSEIF StrCmp(q,cat.msgChkChangeComposed.getstr())
  1050.                             IF basegroup
  1051.                                 z:=Mui_RequestA(app,window,NIL,cat.msgRCompVBsT.getstr(),cat.msgRCompVBsB.getstr(),cat.msgRCompVBs.getstr(),NIL)
  1052.  
  1053.                                 mget(strstr,MUIA_String_Contents,{q})
  1054.                                 StrCopy(str,q)
  1055.                                 doMethodA(l_units,[MUIM_List_GetEntry,strarg,{q}])
  1056.                                 StrCopy(r,q)
  1057.  
  1058.                                 IF (z=1)
  1059.                                     FOR cur:=0 TO glen
  1060.                                         gptr:=groups[cur]
  1061.                                         FOR i:=0 TO gptr.sze
  1062.                                             ptr:=gptr.list[i]
  1063.                                             line:=FALSE
  1064.                                             FOR o:=0 TO ptr.sze
  1065.                                                 IF StrCmp(ptr.base[o],r)
  1066.                                                     DisposeLink(ptr.base[o])
  1067.                                                     ptr.base[o]:=String(StrLen(str))
  1068.                                                     StrCopy(ptr.base[o],str)
  1069.                                                 ENDIF
  1070.                                             ENDFOR
  1071.                                         ENDFOR
  1072.                                     ENDFOR
  1073.                                 ENDIF
  1074.  
  1075.                                 IF (z=1) OR (z=2)
  1076.                                     replace(l_units,strarg,str)
  1077.                                     bptr:=bases[strarg]
  1078.                                     DisposeLink(bptr.name)
  1079.                                     bptr.name:=String(StrLen(str))
  1080.                                     StrCopy(bptr.name,str)
  1081.                                 ENDIF
  1082.                             ELSE
  1083.  
  1084.                                 mget(strstr,MUIA_String_Contents,{q})  ->q contient la nouvelle unité (PTR TO CHAR)
  1085.                                 i:=strarg                             ->i contient le n° d unité composée
  1086.                                 mget(l_groups,MUIA_List_Active,{cur})  ->.. dans le groupe cur
  1087.                                 gptr:=groups[cur]
  1088.                                 ptr:=gptr.list[i]                     ->ptr contient l unité composée à modifier
  1089.                                 END ptr                               ->groups[cur].list[i] est vidé
  1090.                                 NEW ptr                               ->ptr contient une unité composée prête
  1091.                                 ptr.sze:=0
  1092.                                 gptr.list[i]:=ptr                     ->groups[cur].list[i] est prêt
  1093.                                 IF ptr.decode(OP_REPL,q)=FALSE
  1094.                                     JUMP out
  1095.                                 ENDIF                                 ->groups[cur].list[i] contient l unité décodée
  1096.                                 ptr.comp2str()                        ->str contient l unité recompilée
  1097.                                 replace(l_units,i,str)
  1098.                             ENDIF
  1099.                         ELSEIF StrCmp(q,cat.msgRenameBoth.getstr())
  1100.                             mget(strstr,MUIA_String_Contents,{q})            /*q contient le nouveau nom.*/
  1101.                             IF badbase(q) THEN JUMP out
  1102.                             doMethodA(l_units,[MUIM_List_GetEntry,strarg,{a}])/*a contient l ancien nom.*/
  1103.                             cur,n:=findbase(a)
  1104.                                                                 /*cur=numero de l unite de BASE*/
  1105.                             IF n                                /*strarg=numero de l unite COMPOSEE*/
  1106. /*dans la listview*/
  1107.                                 replace(l_units,strarg,q)
  1108.  
  1109.                                 bptr:=bases[cur]
  1110. /*dans les bases*/              DisposeLink(bptr.name)
  1111.                                 bptr.name:=String(StrLen(q))
  1112.                                 StrCopy(bptr.name,q)
  1113.  
  1114.                                 mget(l_groups,MUIA_List_Active,{n})
  1115.                                 gptr:=groups[n]
  1116.                                 ptr:=gptr.list[strarg]
  1117.  
  1118.                                 DisposeLink(ptr.base[])
  1119.                                 ptr.base[]:=String(StrLen(q))
  1120.                                 StrCopy(ptr.base[],q)
  1121.  
  1122.                                 gptr.list[strarg]:=ptr
  1123.  
  1124.                             ENDIF
  1125.                         ELSEIF StrCmp(q,cat.msgFirstGroup.getstr())
  1126.                             mget(strstr,MUIA_String_Contents,{q})
  1127.                             StrCopy(r,q)                            /*r contient le nom du groupe*/
  1128.                             askstr(cat.msgFirstUnit.getstr(),'m',BASE)
  1129.                         ELSEIF StrCmp(q,cat.msgFirstUnit.getstr())
  1130.                             mget(strstr,MUIA_String_Contents,{q})
  1131.                             StrCopy(str,q)                          /*str contient le nom de l unité*/
  1132.                             set(strwin,MUIA_Window_CloseGadget,MUI_TRUE)
  1133.                             set(window,MUIA_Window_Title,cat.msgClearing.getstr())
  1134.                             doMethodA(l_groups,[MUIM_List_Clear])
  1135.                             doMethodA(l_units,[MUIM_List_Clear])
  1136.                             FOR i:=0 TO nbases
  1137.                                 bptr:=bases[i]
  1138.                                 END bptr
  1139.                             ENDFOR
  1140.                             /*FOR i:=0 TO glen
  1141.                                 gptr:=groups[i]
  1142.                                 FOR o:=0 TO gptr.sze           ->Doesn't this make sense????
  1143.                                     ptr:=gptr.list
  1144.                                     END ptr[50]
  1145.                                 ENDIF
  1146.                             ENDFOR*/
  1147.                             set(window,MUIA_Window_Title,cat.msgCreating.getstr())
  1148.                             newud(r,str)
  1149.                             set(window,MUIA_Window_Title,cat.msgTleft.getstr())
  1150.                             set(window,MUIA_Window_Sleep,FALSE)
  1151.                         ENDIF
  1152.                     CASE ID_NEWUD
  1153.                         z:=Mui_RequestA(app,window,0,cat.msgNewUnitData.getstr(),cat.msgNudB.getstr(),cat.msgNud.getstr(),NIL)
  1154.                         IF z=2
  1155.                             saveud()
  1156.                             z:=1
  1157.                         ENDIF
  1158.                         IF z=1
  1159.                             set(window,MUIA_Window_Sleep,MUI_TRUE)
  1160.                             set(strwin,MUIA_Window_CloseGadget,FALSE)
  1161.                             askstr(cat.msgFirstGroup.getstr(),cat.msgDefGroup.getstr(),GROUP)
  1162.                         ENDIF
  1163.                     CASE ID_LOADUD
  1164.                         doMethodA(l_groups,[MUIM_List_Clear])
  1165.                         loadud()
  1166.                         set(l_groups,MUIA_List_Active,MUIV_List_Active_Top)
  1167.                         _returnid(ID_OPENG)
  1168.                     CASE ID_SAVEAS
  1169.                         filereq:=Mui_AllocAslRequest(ASL_FILEREQUEST,
  1170.                                                 [ASL_HAIL,      cat.msgSaveAsT.getstr(),
  1171.                                                  ASL_OKTEXT,    cat.msgSave.getstr(),
  1172.                                                  ASL_FILE,      'UnitData',
  1173.                                                  ASL_FUNCFLAGS, FILF_SAVE,
  1174.                                                  NIL])
  1175.                         IF filereq=NIL
  1176.                             Mui_RequestA(app,window,0,cat.msgSaveAsT.getstr(),NIL,cat.msgNoAslRequest.getstr(),NIL)
  1177.                         ELSE
  1178.                             IF Mui_AslRequest(filereq,NIL)
  1179.                                 StrCopy(str,filereq.drawer)
  1180.                                 AddPart(str,filereq.file,StrMax(str))
  1181.                                 SetStr(str,StrLen(str))
  1182.                                 saveud(str)
  1183.                             ENDIF
  1184.                             Mui_FreeAslRequest(filereq)
  1185.                         ENDIF
  1186.                     CASE ID_LOADFROM
  1187.                         filereq:=Mui_AllocAslRequest(ASL_FILEREQUEST,
  1188.                                                 [ASL_HAIL,      cat.msgLoadFromT.getstr(),
  1189.                                                  ASL_OKTEXT,    cat.msgLoad.getstr(),
  1190.                                                  ASL_FILE,      'UnitData',
  1191.                                                  NIL])
  1192.                         IF filereq=NIL
  1193.                             Mui_RequestA(app,window,0,cat.msgLoadFromT.getstr(),NIL,cat.msgNoAslRequest.getstr(),NIL)
  1194.                         ELSE
  1195.                             IF Mui_AslRequest(filereq,NIL)
  1196.                                 StrCopy(str,filereq.drawer)
  1197.                                 AddPart(str,filereq.file,StrMax(str))
  1198.                                 SetStr(str,StrLen(str))
  1199.  
  1200.                                 doMethodA(l_groups,[MUIM_List_Clear])
  1201.                                 loadud(str)
  1202.                                 set(l_groups,MUIA_List_Active,MUIV_List_Active_Top)
  1203.                                 _returnid(ID_OPENG)
  1204.                             ENDIF
  1205.                             Mui_FreeAslRequest(filereq)
  1206.                         ENDIF
  1207.                     CASE ID_UDSAVE
  1208.                         saveud()
  1209.                     CASE ID_SETLEFT
  1210.                         IF rightt()
  1211.                             set(window,MUIA_Window_Title,cat.msgTleft.getstr())
  1212.                         ENDIF
  1213.                     CASE ID_SETRIGHT
  1214.                         IF Not(rightt())
  1215.                             set(window,MUIA_Window_Title,cat.msgTright.getstr())
  1216.                         ENDIF
  1217.                     CASE ID_SWITCH
  1218.                         IF rightt()
  1219.                             set(window,MUIA_Window_Title,cat.msgTleft.getstr())
  1220.                         ELSE
  1221.                             set(window,MUIA_Window_Title,cat.msgTright.getstr())
  1222.                         ENDIF
  1223.                     CASE ID_INVERSE
  1224.                         IF rightt()
  1225.                             unit2.inverse(type2)
  1226.                             dDiv(dFloat(1,t),fact2,fact2)
  1227.                             convert(DR_LEFT)
  1228.                             StrCopy(r,unit2.comp2str())
  1229.                             set(ud,MUIA_String_Contents,r)
  1230.                             IF dCompare(dFloat(0,t),value2) = 0
  1231.                                 undef2:=TRUE
  1232.                                 StringF(r,'***')
  1233.                             ELSE
  1234.                                 dDiv(t,value2,value2)
  1235.                                 float2str(r,value2)
  1236.                             ENDIF
  1237.                             set(vd,MUIA_String_Contents,r)
  1238.                         ELSE
  1239.                             unit1.inverse(type1)
  1240.                             dDiv(dFloat(1,t),fact1,fact1)
  1241.                             convert(DR_RIGHT)
  1242.                             StrCopy(r,unit1.comp2str())
  1243.                             set(ug,MUIA_String_Contents,r)
  1244.                             IF dCompare(dFloat(0,t),value1) = 0
  1245.                                 undef1:=TRUE
  1246.                                 StringF(r,'***')
  1247.                             ELSE
  1248.                                 dDiv(t,value1,value1)
  1249.                                 float2str(r,value1)
  1250.                             ENDIF
  1251.                             set(vg,MUIA_String_Contents,r)
  1252.                         ENDIF
  1253.                         savelast()
  1254.                     CASE ID_CALC
  1255.                         convert()
  1256.                     CASE ID_UNICALC
  1257.                         convert(DR_UNIVERSAL)
  1258.                     CASE ID_ABOUT
  1259.                         StringF(longstr,'\s\n\s',PROGVER,cat.msgAboutReq.getstr())
  1260.                         Mui_RequestA(app, window, 0, NIL, cat.msgOk.getstr(), longstr,NIL)
  1261.                     CASE ID_HCONT
  1262.                         doMethodA(app, [MUIM_Application_ShowHelp,NIL,'convertor.guide','main'])
  1263.                     CASE ID_HSBC
  1264.                         doMethodA(app, [MUIM_Application_ShowHelp,NIL,'convertor.guide','sbc'])
  1265.                     CASE ID_BUBBLES
  1266.                         IF bubbles
  1267.                             bubbles:=FALSE
  1268.                             set(g1,MUIA_ShortHelp,NIL)
  1269.                             set(g2,MUIA_ShortHelp,NIL)
  1270.                             set(g3,MUIA_ShortHelp,NIL)
  1271.                             set(accu,MUIA_ShortHelp,NIL)
  1272.                             set(ld,MUIA_ShortHelp,NIL)
  1273.                             set(lv_groups,MUIA_ShortHelp,NIL)
  1274.                             set(lv_pfx,MUIA_ShortHelp,NIL)
  1275.                             set(lv_units,MUIA_ShortHelp,NIL)
  1276.                         ELSE
  1277.                             bubbles:=TRUE
  1278.                             set(g1,MUIA_ShortHelp,cat.msgActionHelp.getstr())
  1279.                             set(g2,MUIA_ShortHelp,cat.msgValueHelp.getstr())
  1280.                             set(g3,MUIA_ShortHelp,cat.msgUnitHelp.getstr())
  1281.                             set(accu,MUIA_ShortHelp,cat.msgAccHelp.getstr())
  1282.                             set(ld,MUIA_ShortHelp,cat.msgLdHelp.getstr())
  1283.                             set(lv_groups,MUIA_ShortHelp,cat.msgGroupsLHelp.getstr())
  1284.                             set(lv_pfx,MUIA_ShortHelp,cat.msgPrefixesLHelp.getstr())
  1285.                             set(lv_units,MUIA_ShortHelp,cat.msgUnitsLHelp.getstr())
  1286.                         ENDIF
  1287.                     CASE ID_RESET
  1288.                         doMethodA(l_groups,[MUIM_List_Clear])
  1289.                         loadud()
  1290.                         set(l_groups,MUIA_List_Active,MUIV_List_Active_Top)
  1291.                         set(ug,MUIA_String_Contents,'m')
  1292.                         set(ud,MUIA_String_Contents,'m')
  1293.                         set(vg,MUIA_String_Contents,'1')
  1294.                         set(vd,MUIA_String_Contents,'1')
  1295.                         dFloat(1,fact1)
  1296.                         dFloat(1,fact2)
  1297.                         unit1.createsimple('m')
  1298.                         unit2.createsimple('m')
  1299.                         set(bt_c,MUIA_Selected,MUI_TRUE)
  1300.                         set(accu,MUIA_Slider_Level,14)
  1301.                         set(l_groups,MUIA_List_Active,0)
  1302.                         set(l_pfx,MUIA_List_Active,10)
  1303.                         set(l_units,MUIA_List_Active,0)
  1304.                         _returnid(ID_OPENG)
  1305.                     CASE ID_HIDE
  1306.                         set(app,MUIA_Application_Iconified,MUI_TRUE)
  1307.                     CASE ID_PREFS
  1308.                         doMethodA(app, [MUIM_Application_OpenConfigWindow,NIL])
  1309.                     CASE ID_MABOUT
  1310.                         doMethodA(app, [MUIM_Application_AboutMUI,window])
  1311.                     CASE ID_OPENG
  1312.                         set(l_units,MUIA_List_Quiet,MUI_TRUE)
  1313.                         doMethodA(l_units,[MUIM_List_Clear])
  1314.                         mget(l_groups,MUIA_List_Active,{cur})
  1315.                         IF cur <> MUIV_List_Active_Off
  1316.                             nunits:=-1
  1317.                             doMethodA(l_groups,[MUIM_List_GetEntry,cur,{q}])
  1318.                             IF StrCmp(q,cat.msgBase.getstr())
  1319.                                 basegroup:=TRUE
  1320.                                 FOR i:=0 TO nbases
  1321.                                     nunits++
  1322.                                     bptr:=bases[i]
  1323.                                     a:=String(StrLen(bptr.name))
  1324.                                     StrCopy(a,bptr.name)
  1325.  
  1326.                                     doMethodA(l_units,[MUIM_List_InsertSingle,a,MUIV_List_Insert_Bottom])
  1327.                                 ENDFOR
  1328.                             ELSE
  1329.                                 basegroup:=FALSE
  1330.                                 gptr:=groups[cur]
  1331.                                 FOR i:=0 TO gptr.sze
  1332.                                     nunits++
  1333.                                     ptr:=gptr.list[i]
  1334.                                     a:=String(StrLen(ptr.comp2str()))
  1335.                                     StrCopy(a,str)
  1336.                                     doMethodA(l_units,[MUIM_List_InsertSingle,a,MUIV_List_Insert_Bottom])
  1337.                                 ENDFOR
  1338.                             ENDIF
  1339.                         ENDIF
  1340.                         set(l_units,MUIA_List_Quiet,FALSE)
  1341.                     CASE ID_READU
  1342.                         IF rightt()
  1343.                             readu(TRUE)
  1344.                             convert(DR_LEFT)
  1345.                         ELSE
  1346.                             readu(FALSE)
  1347.                             convert(DR_RIGHT)
  1348.                         ENDIF
  1349.                     CASE ID_CALCR
  1350.                         convert(DR_RIGHT)
  1351.                     CASE ID_CALCL
  1352.                         convert(DR_LEFT)
  1353.                     CASE ID_WRITE
  1354.                         StrCopy(r,unit1.comp2str())
  1355.                         nnset(ug,MUIA_String_Contents,r)
  1356.                         StrCopy(r,unit2.comp2str())
  1357.                         nnset(ud,MUIA_String_Contents,r)
  1358.  
  1359.                         IF undef1
  1360.                             StrCopy(r,'***')
  1361.                         ELSE
  1362.                             float2str(r,value1)
  1363.                         ENDIF
  1364.                         nnset(vg,MUIA_String_Contents,r)
  1365.                         IF undef2
  1366.                             StrCopy(r,'***')
  1367.                         ELSE
  1368.                             float2str(r,value2)
  1369.                         ENDIF
  1370.                         nnset(vd,MUIA_String_Contents,r)
  1371.                     CASE ID_LEFTU
  1372.                         mget(ug,MUIA_String_Contents,{q})
  1373.                         IF unit1.decode(OP_REPL,q,fact1,PFX_ORIGINAL,zero1,type1) = FALSE
  1374.                             JUMP out
  1375.                         ENDIF
  1376.                         unit1.comp2str()
  1377.                         set(ug,MUIA_String_Contents,str)
  1378.                         chkzero()
  1379.                         convert()
  1380.                         savelast()
  1381.                     CASE ID_RIGHTU
  1382.                         mget(ud,MUIA_String_Contents,{q})
  1383.                         IF unit2.decode(OP_REPL,q,fact2,PFX_ORIGINAL,zero2,type2) = FALSE
  1384.                             JUMP out
  1385.                         ENDIF
  1386.                         unit2.comp2str()
  1387.                         set(ud,MUIA_String_Contents,str)
  1388.                         convert()
  1389.                         chkzero()
  1390.                         savelast()
  1391.                 ENDSELECT
  1392. out:
  1393.                 IF sigs THEN Wait(sigs)
  1394.             ENDWHILE
  1395.         ELSE
  1396.             Mui_RequestA(app,window,0,'Convertor',0,cat.msgNoApp.getstr(),0)
  1397.         ENDIF
  1398.     ELSE
  1399.         WriteF('\s\n\s',cat.msgFailure.getstr(),cat.msgNoMui.getstr())
  1400.     ENDIF
  1401. EXCEPT DO
  1402.     IF exception
  1403.         SELECT exception
  1404.         CASE ER_NOUD
  1405.             Mui_RequestA(app,window,0,cat.msgFailure.getstr(),0,cat.msgERnoud.getstr(),0)
  1406.         CASE ER_EMUD
  1407.             Mui_RequestA(app,window,0,cat.msgFailure.getstr(),0,cat.msgERemud.getstr(),0)
  1408.         CASE ER_BADUD
  1409.             Mui_RequestA(app,window,0,cat.msgFailure.getstr(),0,cat.msgERbadud.getstr(),0)
  1410.         CASE ER_BADFORMAT
  1411.             Mui_RequestA(app,window,0,cat.msgFailure.getstr(),0,cat.msgERbadformat.getstr(),0)
  1412.         CASE ER_NOCLASSES
  1413.             Mui_RequestA(app,window,0,cat.msgFailure.getstr(),0,cat.msgNoClasses.getstr(),0)
  1414.         CASE "MEM"
  1415.             Mui_RequestA(app,window,0,cat.msgFailure.getstr(),0,cat.msgLowMemory.getstr(),0)
  1416.         CASE ER_LOC
  1417.             Mui_RequestA(app,window,0,'FAILURE!',0,'Couldn''t open Locale.library!\n',0) /*Attention, il ne faut pas "localiser" ceci! :-)*/
  1418.         DEFAULT
  1419.             Mui_RequestA(app,window,0,cat.msgFailure.getstr(),0,'%s %n',[cat.msgUnknownError.getstr(),exception])
  1420.         ENDSELECT
  1421.     ENDIF
  1422.     dCleanup()
  1423.     IF app THEN Mui_DisposeObject(app)
  1424.     IF undo THEN END undo
  1425.     cat.close()
  1426.     exitclasses()
  1427.     IF muimasterbase THEN CloseLibrary(muimasterbase)
  1428.     IF localebase THEN CloseLibrary(localebase)
  1429. ENDPROC
  1430.  
  1431. PROC appstruct() IS ApplicationObject,
  1432.             MUIA_Application_Title, 'Convertor',
  1433.             MUIA_Application_Version, PROGVER,
  1434.             MUIA_Application_Author, 'Maxime Gamboni',
  1435.             MUIA_Application_Description, cat.msgExchange.getstr(),
  1436.             MUIA_Application_Base, 'CONVERTOR',
  1437.             MUIA_Application_Menustrip, Mui_MakeObjectA(MUIO_MenustripNM,[menu,0]),
  1438.             SubWindow, strwin:=WindowObject,
  1439.                 MUIA_Window_ID,"STRW",
  1440.                 MUIA_Window_Width, MUIV_Window_Width_Screen(50),
  1441.                 MUIA_Window_Height, MUIV_Window_Height_Screen(50),
  1442.                 MUIA_Window_ScreenTitle,PROGNAME,
  1443.  
  1444.                 WindowContents,strstr:=StringObject,
  1445.                     StringFrame,
  1446.                 End,
  1447.             End,
  1448.  
  1449.             SubWindow, window:=WindowObject,
  1450.                 MUIA_Window_Title, cat.msgTleft.getstr(),
  1451.                 MUIA_Window_ID, "CONV",
  1452.                 MUIA_Window_Width, MUIV_Window_Width_Screen(50),
  1453.                 MUIA_Window_Height, MUIV_Window_Height_Screen(50),
  1454.                 MUIA_Window_ScreenTitle,PROGNAME,
  1455.  
  1456.                 WindowContents, VGroup,
  1457.                     Child, g2:=HGroup,
  1458.                         Child, vg:=NewObjectA(cl_sstring.mcc_class,NIL,[
  1459.                             StringFrame,
  1460.                             MUIA_String_Format,MUIV_String_Format_Center,
  1461.                             MUIA_String_Contents,'1',
  1462.                             MUIA_Draggable,MUI_TRUE,
  1463.                             MUIA_Dropable,MUI_TRUE,
  1464.                         End,
  1465.                         Child, vd:=NewObjectA(cl_sstring.mcc_class,NIL,[
  1466.                             StringFrame,
  1467.                             MUIA_String_Format,MUIV_String_Format_Center,
  1468.                             MUIA_String_Contents,'1',
  1469.                             MUIA_Draggable,MUI_TRUE,
  1470.                             MUIA_Dropable,MUI_TRUE,
  1471.                         TAG_DONE]),
  1472.                     End,
  1473.                     Child, g3:=HGroup,
  1474.                         Child, ug:=NewObjectA(cl_sstring.mcc_class,NIL,[
  1475.                             StringFrame,
  1476.                             MUIA_String_Format,MUIV_String_Format_Center,
  1477.                             MUIA_String_Contents,'m',
  1478.                             MUIA_Draggable,MUI_TRUE,
  1479.                             MUIA_Dropable,MUI_TRUE,
  1480.                         End,
  1481.                         Child, ud:=NewObjectA(cl_sstring.mcc_class,NIL,[
  1482.                             StringFrame,
  1483.                             MUIA_String_Format,MUIV_String_Format_Center,
  1484.                             MUIA_String_Contents,'m',
  1485.                             MUIA_Draggable,MUI_TRUE,
  1486.                             MUIA_Dropable,MUI_TRUE,
  1487.                         End,
  1488.                     End,
  1489.                     Child, HGroup,
  1490.                         Child, g1:=HGroup,GroupFrameT(cat.msgAction.getstr()),
  1491.                             Child, bt_a:= TextObject,
  1492.                                 MUIA_Frame,MUIV_Frame_Button,
  1493.                                 MUIA_Background,MUII_ButtonBack,
  1494.                                 MUIA_Text_Contents,'c×',
  1495.                                 MUIA_InputMode,MUIV_InputMode_Toggle,
  1496.                                 MUIA_Selected,FALSE,
  1497.                             End,
  1498.                             Child, bt_b:= TextObject,
  1499.                                 MUIA_Frame,MUIV_Frame_Button,
  1500.                                 MUIA_Background,MUII_ButtonBack,
  1501.                                 MUIA_Text_Contents,'c÷',
  1502.                                 MUIA_InputMode,MUIV_InputMode_Toggle,
  1503.                                 MUIA_Selected,FALSE,
  1504.                             End,
  1505.                             Child, bt_c:= TextObject,
  1506.                                 MUIA_Frame,MUIV_Frame_Button,
  1507.                                 MUIA_Background,MUII_ButtonBack,
  1508.                                 MUIA_Text_Contents,'c=',
  1509.                                 MUIA_InputMode,MUIV_InputMode_Toggle,
  1510.                                 MUIA_Selected,MUI_TRUE,
  1511.                             End,
  1512.                         End,
  1513.                         Child, accu:=SliderObject,MUIA_Slider_Max,14,MUIA_Slider_Min,1,
  1514.                                MUIA_FrameTitle, cat.msgAccuracy.getstr(),
  1515.                                MUIA_Slider_Level,14,
  1516.                         End,
  1517.                     End,
  1518.                     Child, HGroup,
  1519.                         Child, RectangleObject,End,
  1520.                         Child, ld:=RadioObject, MUIA_Disabled,TRUE,MUIA_Radio_Entries,ldtxt,
  1521.                             GroupFrame,End,
  1522.                         Child, RectangleObject,End,
  1523.                     End,
  1524.                     Child, HGroup,
  1525.                         Child, lv_groups := ListviewObject,
  1526.                             MUIA_FrameTitle,cat.msgGroups.getstr(),
  1527.                             MUIA_Listview_DragType,1,
  1528.                             MUIA_Listview_Input, MUI_TRUE,
  1529.                             MUIA_Listview_List, l_groups:=NewObjectA(cl_droplist.mcc_class,NIL,
  1530.                             [   InputListFrame,
  1531.                                 MUIA_List_DragSortable,MUI_TRUE,
  1532.                             End,
  1533.                         End,
  1534.                         Child, BalanceObject  ,End,
  1535.                         Child, lv_pfx := ListviewObject,
  1536.                             MUIA_FrameTitle,cat.msgPrefixes.getstr(),
  1537.                             MUIA_Listview_Input, MUI_TRUE,
  1538.                             MUIA_Listview_List, l_pfx:=ListObject,
  1539.                                 InputListFrame,
  1540.                                 MUIA_List_SourceArray,lvt_pfx,
  1541.                             End,
  1542.                         End,
  1543.                         Child, BalanceObject, End,
  1544.                         Child, lv_units := ListviewObject,
  1545.                             MUIA_FrameTitle,cat.msgUnits.getstr(),
  1546.                             MUIA_Listview_Input, MUI_TRUE,
  1547.                             MUIA_Listview_DragType,1,
  1548.                             MUIA_Listview_List,l_units:=NewObjectA(cl_droplist.mcc_class,NIL,
  1549.                                 [InputListFrame,
  1550.                                 MUIA_List_DragSortable,MUI_TRUE,
  1551.                             End,
  1552.                         End,
  1553.                     End,
  1554.  
  1555.                 End,
  1556.                 End,
  1557.             End
  1558.  
  1559. PROC bip()
  1560. DEF scr
  1561.     mget(window,MUIA_Window_Screen,{scr});DisplayBeep(scr)
  1562. ENDPROC TRUE
  1563. PROC badgroup(name)
  1564. DEF j
  1565.     IF StrCmp(name,cat.msgBase.getstr()) THEN RETURN bip()
  1566.     FOR j:=0 TO glen
  1567.         gptr:=groups[j]
  1568.         IF StrCmp(gptr.title,name) THEN RETURN bip()
  1569.     ENDFOR
  1570.     IF InStr(name,'"')<>-1 THEN RETURN bip()
  1571.     IF InStr(name,' ')<>-1 THEN RETURN bip()
  1572. ENDPROC (StrLen(name)=0)
  1573.  
  1574. PROC badbase(name)
  1575. DEF j,n[2]:STRING
  1576.     FOR j:=0 TO 9           /*0,1,...,9*/
  1577.         StringF(n,'\d',j)
  1578.         IF InStr(name,n)<>-1 THEN RETURN bip()
  1579.     ENDFOR
  1580.     FOR j:=0 TO nbases
  1581.         bptr:=bases[j]
  1582.         IF StrCmp(bptr.name,name) THEN RETURN bip()
  1583.     ENDFOR
  1584.     IF InStr(name,'*')<>-1 THEN RETURN bip()
  1585.     IF InStr(name,'/')<>-1 THEN RETURN bip()
  1586.     IF InStr(name,'^')<>-1 THEN RETURN bip()
  1587.     IF InStr(name,'+')<>-1 THEN RETURN bip()
  1588.     IF InStr(name,'-')<>-1 THEN RETURN bip()
  1589.     IF InStr(name,'(')<>-1 THEN RETURN bip()
  1590.     IF InStr(name,')')<>-1 THEN RETURN bip()
  1591.     IF InStr(name,'.')<>-1 THEN RETURN bip()
  1592.     IF InStr(name,'"')<>-1 THEN RETURN bip()
  1593.     IF InStr(name,' ')<>-1 THEN RETURN bip()
  1594. ENDPROC (StrLen(name)=0)
  1595.  
  1596. PROC initC() /*Initialize Convertor*/
  1597.     unit1.base:=NewR(8)
  1598.     unit1.pfx:=NewR(8)
  1599.     unit1.expo:=NewR(8)
  1600.     unit1.sze:=0
  1601.     unit1.base[]:=String(2);StrCopy(unit1.base[],'m')
  1602.     unit1.pfx[]:=20;dFloat(0,value1);dFloat(1,fact1);dFloat(0,zero1)
  1603.     StrCopy(type1,'ONNNNNNNNNNNNNNNNNNN')
  1604.     unit1.expo[]:=1
  1605.     unit2.base:=NewR(8)
  1606.     unit2.pfx:=NewR(8)
  1607.     unit2.expo:=NewR(8)
  1608.     unit2.sze:=0
  1609.     unit2.base[]:=String(2);StrCopy(unit2.base[],'m')
  1610.     unit2.pfx[]:=20;dFloat(0,value2);dFloat(1,fact2);dFloat(0,zero2)
  1611.     StrCopy(type2,'ONNNNNNNNNNNNNNNNNNN')
  1612.     unit2.expo[]:=1
  1613.     pref[0].name:= 'Y';dFloat(24,pref[0].exp)
  1614.     pref[1].name:= 'Z';dFloat(21,pref[1].exp)
  1615.     pref[2].name:= 'E';dFloat(18,pref[2].exp)
  1616.     pref[3].name:= 'P';dFloat(15,pref[3].exp)
  1617.     pref[4].name:= 'T';dFloat(12,pref[4].exp)
  1618.     pref[5].name:= 'G';dFloat( 9,pref[5].exp)
  1619.     pref[6].name:= 'M';dFloat( 6,pref[6].exp)
  1620.     pref[7].name:= 'K';dFloat( 3,pref[7].exp)
  1621.     pref[8].name:= 'H';dFloat( 2,pref[8].exp)
  1622.     pref[9].name:='Da';dFloat( 1,pref[9].exp)
  1623.     pref[10].name:='d';dFloat(-1,pref[10].exp)
  1624.     pref[11].name:='c';dFloat(-2,pref[11].exp)
  1625.     pref[12].name:='m';dFloat(-3,pref[12].exp)
  1626.     pref[13].name:='µ';dFloat(-6,pref[13].exp)
  1627.     pref[14].name:='n';dFloat(-9,pref[14].exp)
  1628.     pref[15].name:='p';dFloat(-12,pref[15].exp)
  1629.     pref[16].name:='f';dFloat(-15,pref[16].exp)
  1630.     pref[17].name:='a';dFloat(-18,pref[17].exp)
  1631.     pref[18].name:='z';dFloat(-21,pref[18].exp)
  1632.     pref[19].name:='y';dFloat(-24,pref[19].exp)
  1633.     dFloat(0,pref[20].exp)
  1634.     pref[20].name:=NIL
  1635.     dFloat(10,ten)
  1636.     savelast()
  1637. ENDPROC  
  1638.  
  1639. PROC supera2d(source:PTR TO CHAR,dest:PTR TO longreal) HANDLE
  1640. DEF mtd=NIL:PTR TO mathtermd
  1641.     IF StrCmp(source,'***')
  1642.         dFloat(0,dest)
  1643.         RETURN TRUE
  1644.     ENDIF
  1645.     NEW mtd.mathtermd(source,NIL)
  1646.     mtd.calc(dest)
  1647. EXCEPT DO
  1648.     IF mtd THEN END mtd
  1649.     IF exception = ER_MATH
  1650.         dFloat(0,dest)
  1651.         RETURN TRUE
  1652.     ENDIF
  1653.     IF exception THEN Raise(exception)
  1654. ENDPROC FALSE
  1655.  
  1656. PROC convert(direction=DR_CURR)
  1657. DEF abort
  1658.     abort:=noconvert
  1659.     IF direction=DR_UNIVERSAL
  1660.         abort:=FALSE
  1661.         direction:=DR_CURR
  1662.     ENDIF
  1663.     IF direction=DR_CURR
  1664.         IF rightt()
  1665.             direction:=DR_LEFT
  1666.         ELSE
  1667.             direction:=DR_RIGHT
  1668.         ENDIF
  1669.     ENDIF
  1670.     IF direction=DR_RIGHT
  1671.         _returnid(ID_SETLEFT)
  1672.         mget(vg,MUIA_String_Contents,{a})
  1673.         undef1:=supera2d(a,value1)
  1674.         IF abort THEN RETURN
  1675.         IF StrCmp(type1,type2)
  1676.             IF level()
  1677.                 dDiv(dMul(value1,fact1,s),fact2,value2)
  1678.             ELSE
  1679.                 dDiv(dAdd(dMul(value1,fact1,s),dSub(zero1,zero2,t),s),fact2,value2)
  1680.             ENDIF
  1681.             dCopy(s,value2)
  1682.             dAbs(s)
  1683.             dLog(s)
  1684.             i:=Max(0,dFix(s))
  1685.             mget(accu,MUIA_Slider_Level,{cur})
  1686.             float2str(str,value2,cur)
  1687.             undef2:=FALSE
  1688.         ELSE
  1689.             StrCopy(str,'***')
  1690.             undef2:=TRUE
  1691.         ENDIF
  1692.         doMethodA(vd,[MUIM_NoNotifySet,MUIA_String_Contents,str])
  1693.     ELSEIF direction=DR_LEFT
  1694.         _returnid(ID_SETRIGHT)
  1695.         mget(vd,MUIA_String_Contents,{b})
  1696.         undef2:=supera2d(b,value2)
  1697.         IF abort THEN RETURN
  1698.         IF StrCmp(type1,type2)
  1699.             IF level()
  1700.                 dDiv(dMul(value2,fact2,s),fact1,value1)
  1701.             ELSE
  1702.                 dDiv(dAdd(dMul(value2,fact2,s),dSub(zero2,zero1,t),s),fact1,value1)
  1703.             ENDIF
  1704.             dCopy(s,value1)
  1705.             dLog(dAbs(s))
  1706.             i:=Max(0,dFix(s))
  1707.             mget(accu,MUIA_Slider_Level,{cur})
  1708.             float2str(str,value1,cur)
  1709.             undef1:=FALSE
  1710.         ELSE
  1711.             StrCopy(str,'***')
  1712.             undef1:=TRUE
  1713.         ENDIF
  1714.         doMethodA(vg,[MUIM_NoNotifySet,MUIA_String_Contents,str])
  1715.     ENDIF
  1716. ENDPROC
  1717.  
  1718. PROC rightt()
  1719. DEF title:PTR TO CHAR
  1720.     mget(window,MUIA_Window_Title,{title})
  1721. ENDPROC StrCmp(title,cat.msgTright.getstr())
  1722.  
  1723. PROC savelast()
  1724. DEF j
  1725.     IF current<(undosteps-1)            /*suppression des noeuds redo inutiles*/
  1726.         FOR j:=current+1 TO undosteps-1
  1727.             un:=undo.getitem(j)
  1728.             IF un <> NIL THEN
  1729.                 END un.v1;END un.v2;END un.u1;END un.u2;END un
  1730.             undo.setitem(j,NIL)
  1731.         ENDFOR
  1732.     ENDIF
  1733.     NEW un                              /*Création d'un noeud Undo avec les valeurs en cours*/
  1734.     NEW un.v1
  1735.     NEW un.v2
  1736.     NEW un.u1
  1737.     NEW un.u2
  1738.     dCopy(un.v1,value1)
  1739.     dCopy(un.v2,value2)
  1740.     un.u1.copycomp(unit1,NEWC)
  1741.     un.u2.copycomp(unit2,NEWC)
  1742.     undo.setitem(current+1,un)          /*ajout du nouveau noeud dans la liste*/
  1743.     undo.first:=Mod(current+2+undo.first,undosteps)
  1744.     current:=undosteps-1                /*pas de redo...*/
  1745. ENDPROC
  1746.  
  1747. PROC chkzero()
  1748.     IF (unit1.simple() AND unit2.simple())<>TRUE
  1749.         set(ld,MUIA_Disabled,MUI_TRUE)
  1750.         RETURN
  1751.     ENDIF
  1752.     IF dCompare(zero1,zero2)
  1753.         set(ld,MUIA_Disabled,FALSE)
  1754.     ELSE
  1755.         set(ld,MUIA_Disabled,MUI_TRUE)
  1756.     ENDIF
  1757. ENDPROC
  1758.  
  1759. PROC level()
  1760.     mget(ld,MUIA_Disabled,{z})
  1761.     IF z=TRUE
  1762.         RETURN TRUE
  1763.     ENDIF
  1764.     mget(ld,MUIA_Radio_Active,{z})
  1765. ENDPROC z=1
  1766.  
  1767. PROC splitfloat(source:PTR TO myreal)
  1768. ENDPROC source.a,source.b
  1769.  
  1770. PROC joinfloat(source1,source2,dest:PTR TO myreal)
  1771.     dest.a:=source1
  1772.     dest.b:=source2
  1773. ENDPROC
  1774.  
  1775. PROC float2str(st:PTR TO CHAR,lr:PTR TO longreal,digits=14)
  1776. DEF longr:longreal,ps,j,buff[30]:STRING,
  1777. wk[30]:STRING,big,expn[6]:STRING
  1778.  
  1779.     digits++
  1780.     dCopy(longr,lr)
  1781.     dLog(dAbs(longr))
  1782.     j:=dFix(longr)
  1783.     IF Abs(j)>8
  1784.         IF j < 0
  1785.             dLFormat(st,lr,Min(13,digits))
  1786.         ELSE
  1787.             dLFormat(st,lr,digits)
  1788.         ENDIF
  1789.         big:=InStr(st,'E')
  1790.         IF big =-1
  1791.             big:=FALSE
  1792.             StrCopy(wk,st)
  1793.         ELSE
  1794.             StrCopy(wk,st,big)
  1795.             MidStr(expn,st,big)
  1796.             big:=TRUE
  1797.         ENDIF
  1798.     ELSE
  1799.         big:=FALSE
  1800.         j:=Max(0,j)
  1801.         dFormat(st,lr,Max(1,digits-j-1))
  1802.         StrCopy(wk,st)
  1803.     ENDIF
  1804.  
  1805.     ps:=StrLen(wk)-1
  1806.     MidStr(buff,wk,ps)
  1807.     IF Val(buff)>4 -> Supprime les neufs et incr.
  1808.         REPEAT
  1809.             SetStr(wk,StrLen(wk)-1)
  1810.             ps:=StrLen(wk)-1
  1811.             MidStr(buff,wk,ps)
  1812.         UNTIL Not(StrCmp(buff,'9'))
  1813.         IF StrCmp(buff,'.')
  1814.             MidStr(buff,wk,0,ps)
  1815.             j:=Val(buff)
  1816.             StringF(wk,'\d',j+Sign(j))
  1817.         ELSE
  1818.             j:=Val(buff)
  1819.             StringF(buff,'\d',j+1)
  1820.             wk[ps]:=buff[]
  1821.         ENDIF
  1822.     ELSEIF StrCmp(buff,'0') -> Supprime les zéros.
  1823.         REPEAT
  1824.             SetStr(wk,StrLen(wk)-1)
  1825.             ps:=StrLen(wk)-1
  1826.             MidStr(buff,wk,ps)
  1827.         UNTIL Not(StrCmp(buff,'0'))
  1828.         IF StrCmp(buff,'.')
  1829.             SetStr(wk,StrLen(wk)-1)
  1830.         ENDIF
  1831.     ELSE
  1832.         SetStr(wk,StrLen(wk)-1)
  1833.         ps:=StrLen(wk)-1
  1834.         MidStr(buff,wk,ps)
  1835.         IF StrCmp(buff,'.') THEN SetStr(wk,StrLen(wk)-1)
  1836.         /*MidStr(buff,wk,digits,1)
  1837.         j:=Val(buff)
  1838.         StringF(buff,'\d',j+1)
  1839.         wk[digits]:=buff[]*/
  1840.     ENDIF
  1841.  
  1842.     StrCopy(st,wk)
  1843.     IF big
  1844.         StrAdd(st,expn)
  1845.     ENDIF
  1846. ENDPROC st
  1847.  
  1848. PROC saveud(filename=-1:PTR TO CHAR)
  1849. DEF k,l,m[21]:STRING
  1850.  
  1851.     IF filename=-1 THEN filename:='UnitData'
  1852.  
  1853.     set(window,MUIA_Window_Title,cat.msgSaveUDA.getstr())
  1854.     handler:=Open(filename,NEWFILE)
  1855.     oldstdout:=SetStdOut(handler)
  1856.     WriteF('CONVERTOR-UnitData Type4\n:SI\n')
  1857.     FOR i:=0 TO nsi-1
  1858.         ptr:=si[i]
  1859.         ptr.comp2str()
  1860.         IF i <> 0 THEN WriteF(';')
  1861.         WriteF(str)
  1862.     ENDFOR
  1863.     WriteF('\n:Bases\n')
  1864.     FOR i:=0 TO nbases
  1865.         bptr:=bases[i]
  1866.         WriteF('\s\n',bptr.name)
  1867.         k,l:=splitfloat(bptr.value)
  1868.         WriteF('\z\h[8]\z\h[8]',k,l)
  1869.         IF dCompare(dFloat(0,s),bptr.zero)
  1870.             k,l:=splitfloat(bptr.zero)
  1871.             WriteF('\z\h[8]\z\h[8]',k,l)
  1872.         ENDIF
  1873.         StrCopy(m,bptr.type)
  1874.         k:=StrLen(m)-1 -> last char
  1875.         WHILE (k > 0) AND (m[k]="N")
  1876.             k--
  1877.         ENDWHILE
  1878.         SetStr(m,k+1)
  1879.         WriteF('\n\s\n',m)
  1880.     ENDFOR
  1881.     WriteF(':Groups\n')
  1882.  
  1883.     set(window,MUIA_Window_Title,cat.msgSaveUDB.getstr())
  1884.     FOR cur:=0 TO glen
  1885.         gptr:=groups[cur]
  1886.         WriteF(':Group \s\n',gptr.title)
  1887.         FOR i:=0 TO gptr.sze
  1888.             nunits++
  1889.             ptr:=gptr.list[i]
  1890.             ptr.comp2str()
  1891.             WriteF('\s\n',str)
  1892.         ENDFOR
  1893.     ENDFOR
  1894.  
  1895.     SetStdOut(oldstdout)
  1896.     Close(handler)
  1897.     set(window,MUIA_Window_Title,cat.msgTleft.getstr())
  1898. ENDPROC
  1899.  
  1900. PROC loadud(filename=-1)
  1901. DEF quit,stri[40]:STRING,silist[40]:STRING,ptc:PTR TO CHAR,nme[50]:STRING,
  1902. j,k,var
  1903.  
  1904.     IF filename=-1 ; StrCopy(nme,'UnitData')
  1905.     ELSE; StrCopy(nme,filename) ; ENDIF
  1906.  
  1907.     cur:=-1
  1908.     glen:=-1
  1909.     quit:=FALSE
  1910.     line:=-1
  1911.     nbases:=-1
  1912.  
  1913.     IF handler:=Open(nme,OLDFILE)
  1914.         statusu:=ReadStr(handler,r)
  1915.         IF r[] OR (statusu <> -1)
  1916.             IF Not(StrCmp(r,'CONVERTOR-UnitData Type4'))
  1917.                 Close(handler)
  1918.                 Raise(ER_BADUD)
  1919.             ENDIF
  1920.         ELSE
  1921.             Close(handler)
  1922.             Raise(ER_EMUD)
  1923.         ENDIF
  1924.  
  1925.         statusu:=ReadStr(handler,r)
  1926.         IF r[] OR (statusu <> -1)
  1927.             IF Not(StrCmp(r,':SI'))
  1928.                  Mui_RequestA(app,window,0,'Convertor',0,cat.msgNoSiTag.getstr(),0)
  1929.                 Close(handler)
  1930.                 Raise(ER_BADFORMAT)
  1931.             ENDIF
  1932.         ELSE
  1933.             Close(handler)
  1934.             Raise(ER_BADFORMAT)
  1935.         ENDIF
  1936.  
  1937.         statusu:=ReadStr(handler,r)
  1938.         IF r[] OR (statusu <> -1)
  1939.             StrCopy(silist,r)
  1940.         ELSE
  1941.             Close(handler)
  1942.             Raise(ER_BADFORMAT)
  1943.         ENDIF
  1944.  
  1945.         statusu:=ReadStr(handler,r)
  1946.         IF r[] OR (statusu <> -1)
  1947.             IF Not(StrCmp(r,':Bases'))
  1948.                 Mui_RequestA(app,window,0,'Convertor',0,cat.msgNoBasesTag.getstr(),0)
  1949.                 Close(handler)
  1950.                 Raise(ER_BADFORMAT)
  1951.             ENDIF
  1952.         ELSE
  1953.             Close(handler)
  1954.             Raise(ER_EMUD)
  1955.         ENDIF
  1956.         REPEAT
  1957.             statusu:=ReadStr(handler,r)          /*(1)*/
  1958.             IF Not(r[]) AND (statusu = -1)
  1959.                 Mui_RequestA(app,window,0,'Convertor',0,cat.msgWrongEOF.getstr(),0)
  1960.                 Close(handler)
  1961.                 Raise(ER_BADFORMAT)
  1962.             ENDIF
  1963.  
  1964.             IF StrCmp(r,':Groups')
  1965.                 quit:=TRUE
  1966.             ELSE
  1967.                 nbases++
  1968.                 NEW bptr
  1969.                 bases[nbases]:=bptr
  1970.                 bptr.name:=String(StrLen(r))
  1971.                 StrCopy(bptr.name,r)
  1972.  
  1973.                 statusu:=ReadStr(handler,r)      /*(2)*/
  1974.                 IF Not(r[]) AND (statusu = -1)
  1975.                     Mui_RequestA(app,window,0,'Convertor',0,cat.msgWrongEOF.getstr(),0)
  1976.                     Close(handler)
  1977.                     Raise(ER_BADFORMAT)
  1978.                 ENDIF
  1979.                 IF StrCmp(r,':Bases') OR StrCmp(r,':Groups')
  1980.                     Mui_RequestA(app,window,0,'Convertor',0,cat.msgWrongTag.getstr(),0)
  1981.                     Close(handler)
  1982.                     Raise(ER_BADFORMAT)
  1983.                 ENDIF
  1984.                 StrCopy(stri,'$')
  1985.                 MidStr(nme,r,0,8)
  1986.                 StrAdd(stri,nme)
  1987.                 j:=Val(stri)
  1988.  
  1989.                 StrCopy(stri,'$')
  1990.                 MidStr(nme,r,8,8)
  1991.                 StrAdd(stri,nme)
  1992.                 k:=Val(stri)
  1993.  
  1994.                 joinfloat(j,k,bptr.value)
  1995.  
  1996.                 IF StrLen(r) > 18
  1997.                     StrCopy(stri,'$')
  1998.                     MidStr(nme,r,16,8)
  1999.                     StrAdd(stri,nme)
  2000.                     j:=Val(stri)
  2001.  
  2002.                     StrCopy(stri,'$')
  2003.                     MidStr(nme,r,24,8)
  2004.                     StrAdd(stri,nme)
  2005.                     k:=Val(stri)
  2006.  
  2007.                     joinfloat(j,k,bptr.zero)
  2008.                 ENDIF
  2009.                 statusu:=ReadStr(handler,r)      /*(3)*/
  2010.                 IF Not(r[]) AND (statusu = -1)
  2011.                     Mui_RequestA(app,window,0,'Convertor',0,cat.msgWrongEOF.getstr(),0)
  2012.                     Close(handler)
  2013.                     Raise(ER_BADFORMAT)
  2014.                 ENDIF
  2015.                 bptr.type:=String(StrLen(r))
  2016.                 StrCopy(bptr.type,r)
  2017.  
  2018.             ENDIF
  2019.  
  2020.         UNTIL quit
  2021.         quit:=FALSE
  2022.         REPEAT
  2023.             statusu:=ReadStr(handler,r)
  2024.             var:=r[]
  2025.             IF var OR (statusu <> -1)
  2026.                 gptr:=groups[cur]
  2027.                 IF StrCmp(r,':Group ',7)
  2028.                     IF cur > -1                   /*Que se passe-t-il sinon?*/
  2029.                         gptr.sze:=line            
  2030.                     ENDIF
  2031.                     glen++
  2032.                     cur++
  2033.                     NEW gptr
  2034.                     groups[cur]:=gptr
  2035.                     gptr.list:=NewR(50*4)
  2036.                     gptr.title:=String(15)
  2037.                     ptc:=String(15)
  2038.                     MidStr(ptc,r,7)
  2039.                     doMethodA(l_groups,[MUIM_List_InsertSingle,ptc,MUIV_List_Insert_Bottom])
  2040.                     StrCopy(gptr.title,ptc)
  2041.                     line:=-1
  2042.                 ELSE
  2043.                     line++
  2044.                     NEW ptr
  2045.                     ptr.sze:=0
  2046.                     gptr.list[line]:=ptr
  2047.                     IF ptr.decode(OP_REPL,r) = FALSE
  2048.                         END ptr
  2049.                         line--
  2050.                     ENDIF
  2051.                 ENDIF
  2052.             ELSE
  2053.                 quit:=TRUE
  2054.             ENDIF
  2055.             IF CtrlC()
  2056.                 Mui_RequestA(app,window,0,'Convertor',0,cat.msgUserAbort.getstr(),0)
  2057.                 quit:=TRUE
  2058.             ENDIF
  2059.         UNTIL quit
  2060.         Close(handler)
  2061.     ELSE
  2062.         Raise(ER_NOUD)
  2063.     ENDIF
  2064.     gptr:=groups[cur]
  2065.     gptr.sze:=line
  2066.     ->glen++
  2067.     /*lvt_groups[glen+1]:=String(6)
  2068.     StrCopy(lvt_groups[glen+1],'Base')
  2069.     lvt_groups[glen+2]:=NIL*/
  2070.     doMethodA(l_groups,[MUIM_List_InsertSingle,cat.msgBase.getstr(),MUIV_List_Insert_Bottom])
  2071.     StrCopy(r,silist)              /*;   ; */       /*DECODAGE DES UNITES SI*/
  2072.     z:=-1                          /* i->z */
  2073.     n:=FALSE
  2074.     nsi:=0
  2075.     REPEAT
  2076.         i:=z+1
  2077.         z:=InStr(r,';',i)
  2078.         IF z=-1
  2079.             z:=StrLen(r)
  2080.             n:=TRUE
  2081.         ENDIF
  2082.         MidStr(stri,r,i,z-i)
  2083.         NEW ptr
  2084.         IF ptr.decode(OP_REPL,stri) = FALSE
  2085.             END ptr
  2086.             Raise(ER_BADFORMAT)
  2087.         ELSE
  2088.             si[nsi++]:=ptr
  2089.         ENDIF
  2090.     UNTIL n
  2091.  
  2092. ENDPROC
  2093. PROC newud(grp,unt)
  2094. DEF ptc:PTR TO CHAR
  2095.     nbases:=0
  2096.     NEW bptr
  2097.     bases[]:=bptr
  2098.     bptr.name:=String(StrLen(unt))
  2099.     StrCopy(bptr.name,unt)
  2100.     dFloat(1,bptr.value)
  2101.     dFloat(0,bptr.zero)
  2102.     bptr.type:=String(1)                     /*bases*/
  2103.     StrCopy(bptr.type,'O')
  2104.     glen:=0
  2105.     gptr:=groups[]
  2106.     gptr.list:=NewR(50*4)
  2107.     gptr.sze:=0
  2108.     gptr.title:=String(StrLen(grp))
  2109.     StrCopy(gptr.title,grp)
  2110.     ptc:=String(StrLen(grp))
  2111.     StrCopy(ptc,grp)
  2112.     doMethodA(l_groups,[MUIM_List_InsertSingle,ptc,MUIV_List_Insert_Bottom])
  2113.     NEW ptr
  2114.     gptr.list[]:=ptr        /*composées (groupes)*/
  2115.     ptr.createsimple(unt)
  2116.     doMethodA(l_groups,[MUIM_List_InsertSingle,cat.msgBase.getstr(),MUIV_List_Insert_Bottom])
  2117.     nsi:=0
  2118.     NEW ptr
  2119.     ptr.createsimple(unt)              /*Si*/
  2120.     si[]:=ptr
  2121. ENDPROC
  2122. /****************************************************
  2123. *                                                   *
  2124. *   ptr.simple()                                    *
  2125. *                                                   *
  2126. *   Renvoie TRUE (pas MUI_TRUE!) si ptr est simple: *
  2127. *   - Une seule unité de base                       *
  2128. *   - Pas de préfixe                                *
  2129. *   - Pas d'exposant                                *
  2130. *   - Pas inversé                                   *
  2131. *                                                   *
  2132. ****************************************************/
  2133.  
  2134. PROC simple() OF composed
  2135.     IF self.sze <> 0 THEN RETURN FALSE
  2136.     IF self.pfx[] <> 20 THEN RETURN FALSE
  2137.     IF self.expo[] <> 1  THEN RETURN FALSE
  2138. ENDPROC TRUE
  2139.  
  2140. /****************************************************
  2141. *                                                   *
  2142. *   ptr.createsimple(str)                           *
  2143. *                                                   *
  2144. *   Crée une unité composée simple (voir ptr.simple)*
  2145. *   formée avec l'unité de base str.                *
  2146. *                                                   *
  2147. ****************************************************/
  2148.  
  2149. PROC createsimple(bs:PTR TO CHAR) OF composed
  2150.     NEW self.base;self.base[]:=String(StrLen(bs))
  2151.     StrCopy(self.base[],bs)
  2152.     NEW self.pfx; self.pfx[]:=20
  2153.     NEW self.expo;self.expo[]:=1
  2154.     self.sze:=0
  2155. ENDPROC
  2156.  
  2157. /****************************************************
  2158. *                                                   *
  2159. *  StrCopy(ch,ptr.comp2str())                       *
  2160. *                                                   *
  2161. *  convertit ptr en chaîne via str (renvoie aussi   *
  2162. *                                   son pointeur)   *
  2163. *                                                   *
  2164. ****************************************************/
  2165.  
  2166. PROC comp2str() OF composed
  2167. DEF j,xp,wrote=FALSE,ds=0,t,found
  2168.     StrCopy(str,'')
  2169.     FOR j:=0 TO self.sze
  2170.         xp:=self.expo[j]
  2171.  
  2172.         IF xp > 0
  2173.             IF wrote
  2174.                 StrAdd(str,'*')
  2175.             ELSE
  2176.                 wrote:=TRUE
  2177.             ENDIF
  2178.  
  2179.             IF self.pfx[j] <> 20
  2180.                 StringF(r,'\s\s',pref[self.pfx[j]].name,self.base[j])
  2181.                 t,found:=findbase(r)
  2182.                 IF found THEN StringF(r,'\s.\s',pref[self.pfx[j]].name,self.base[j])
  2183.                 StrAdd(str,r)
  2184.             ELSE
  2185.                 StrAdd(str,self.base[j])
  2186.             ENDIF
  2187.             IF xp<>1
  2188.                 StringF(r,'^\d',xp)
  2189.                 StrAdd(str,r)
  2190.             ENDIF
  2191.         ELSE
  2192.             ds++
  2193.         ENDIF
  2194.     ENDFOR
  2195.     IF wrote=FALSE
  2196.         StrCopy(str,'1')
  2197.     ENDIF
  2198.     IF ds
  2199.         wrote:=FALSE
  2200.         FOR j:=0 TO self.sze
  2201.             xp:=-self.expo[j]
  2202.  
  2203.             IF xp > 0
  2204.                 IF wrote=FALSE
  2205.                     StrAdd(str,'/')
  2206.                     IF ds > 1
  2207.                         StrAdd(str,'(')
  2208.                     ENDIF
  2209.                     wrote:=TRUE
  2210.                 ELSE
  2211.                     StrAdd(str,'*')
  2212.                 ENDIF
  2213.  
  2214.                 IF self.pfx[j] <> 20
  2215.                     StringF(r,'\s\s',pref[self.pfx[j]].name,self.base[j])
  2216.                     StrAdd(str,r)
  2217.                 ELSE
  2218.                     StrAdd(str,self.base[j])
  2219.                 ENDIF
  2220.                 IF xp<>1
  2221.                     StringF(r,'^\d',xp)
  2222.                     StrAdd(str,r)
  2223.                 ENDIF
  2224.             ENDIF
  2225.         ENDFOR
  2226.         IF ds > 1
  2227.             StrAdd(str,')')
  2228.         ENDIF
  2229.     ENDIF
  2230. ENDPROC str
  2231.  
  2232. /****************************************************
  2233. *                                                   *
  2234. *   ptr.decode(action,ch[,value,[newprefix[,        *
  2235. *   zero[,type]]]])                                 *
  2236. *                                                   *
  2237. *   convertit une E-string (ch) en composed (ptr)   *
  2238. *                                                   *
  2239. *   action  :action à effectuer sur l'unité ptr.    *
  2240. *            OP_MUL,OP_DIV ou OP_REPL.              *
  2241. *   value:facteur de l'unité (en sortie)            *
  2242. *   newprefix:Si il faut changer le préfixe, le     *
  2243. *                               mettre ici.         *
  2244. *   zero:Si non-NIL, reçoit le zéro de l'unité.     *
  2245. *   type:type de l'unité au format .type (NNO..),   *
  2246. *        en sortie.                                 *
  2247. *                                                   *
  2248. ****************************************************/
  2249.  
  2250. PROC decode(action,st,real=NIL:PTR TO longreal,npfx=PFX_ORIGINAL,
  2251.                    zero=NIL:PTR TO longreal,tpe=NIL:PTR TO CHAR) OF composed
  2252. DEF num,found,work[60]:STRING,pos1,pos2,sze,strl,     /*pos1 est le début du mot en cours et pos2 est la fin*/
  2253.     j,k,l,inv,linv,w:longreal,v:longreal,bbase:PTR TO LONG,bpfx:PTR TO LONG,bexpo:PTR TO LONG,
  2254.     always=FALSE,close=FALSE,locstr[60]:STRING,sPower[20]:ARRAY OF LONG,int:PTR TO CHAR,nilbase,
  2255.     msg[50]:STRING
  2256.  
  2257.     IF tpe
  2258.         FOR j:=0 TO 19
  2259.             sPower[j]:=0
  2260.         ENDFOR
  2261.     ENDIF
  2262.  
  2263.     IF real
  2264.         dFloat(1,real)
  2265.     ENDIF
  2266.  
  2267.     IF self.sze AND (action=OP_REPL)
  2268.         END self.base
  2269.         END self.pfx
  2270.         END self.expo
  2271.     ENDIF
  2272.  
  2273.     strl:=StrLen(st)
  2274.     j:=strl/2+1
  2275.  
  2276.     IF action=OP_REPL
  2277.         NEW self.base[j+1]
  2278.         NEW self.pfx[j+1]
  2279.         NEW self.expo[j+1]
  2280.         sze:=-1
  2281.     ELSE
  2282.         sze:=self.sze
  2283.         NEW bbase[sze+1];NEW bpfx[sze+1];NEW bexpo[sze+1]   /*stockage des données pendant le*/
  2284.                                                             /*changement de taille.          */
  2285.         FOR k:=0 TO sze
  2286.             bbase[k]:=self.base[k]                          /*->tampon*/
  2287.             bpfx[k]:=self.pfx[k]
  2288.             bexpo[k]:=self.expo[k]
  2289.         ENDFOR
  2290.         j:=j+sze
  2291.         END self.base;END self.pfx;END self.expo            /*Change la taille*/
  2292.         NEW self.base[j+1];NEW self.pfx[j+1];NEW self.expo[j+1]
  2293.  
  2294.         FOR k:=0 TO sze
  2295.             self.base[k]:=bbase[k]
  2296.             self.pfx[k]:=bpfx[k]                            /*tampon->*/
  2297.             self.expo[k]:=bexpo[k]
  2298.             IF (real <> NIL) OR (tpe <> NIL)                /*Si real n'est pas NIL,...*/
  2299.                 num,found:=findbase(self.base[k])           /*...On calcule le facteur en passant.*/
  2300.                 IF found
  2301.                     bptr:=bases[num]
  2302.                     IF real <> NIL
  2303.                         dMul(dPow(dMul( dPow(ten,pref[self.pfx[k]].exp,v), bptr.value, v ),dFloat(self.expo[k],w),w),real,real)
  2304.                     ENDIF
  2305.                     IF tpe <> NIL                                   /*Calcul du type*/
  2306.                         int:=bptr.type
  2307.                         FOR l:=0 TO StrLen(int)-1
  2308.                             sPower[l]:=sPower[l]+((int[l]-78)*(self.expo[k]))
  2309.                         ENDFOR
  2310.                     ENDIF
  2311.                 ELSE
  2312.                     StringF(msg,'\s \s \s',cat.msgLostUnitA.getstr(),self.base[k],cat.msgLostUnitB.getstr())
  2313.                     Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
  2314.                 ENDIF
  2315.  
  2316.             ENDIF
  2317.         ENDFOR
  2318.         END bbase;END bpfx;END bexpo                        /*suppression du tampon*/
  2319.     ENDIF
  2320.  
  2321.     pos1:=0
  2322.     inv:=FALSE
  2323.  
  2324.     REPEAT
  2325.  
  2326.         linv:=inv;inv:=FALSE
  2327.         IF close THEN always:=FALSE
  2328.  
  2329.         sze++
  2330.         pos2:=InStr(st,'*',pos1)
  2331.         IF pos2=-1 THEN pos2:=strl+1
  2332.         j:=InStr(st,'/',pos1)
  2333.  
  2334.         IF j<pos2 AND (j<>-1)
  2335.             pos2:=j
  2336.             inv:=TRUE
  2337.         ENDIF
  2338.  
  2339.         MidStr(locstr,st,pos1,pos2-pos1)
  2340.  
  2341.         IF InStr(locstr,'(')<>-1
  2342.             MidStr(work,locstr,1)
  2343.             StrCopy(locstr,work)
  2344.             IF linv
  2345.                 linv:=FALSE
  2346.                 always:=TRUE
  2347.             ENDIF
  2348.         ENDIF
  2349.  
  2350.         IF InStr(locstr,')')<>-1
  2351.             MidStr(work,locstr,0,StrLen(locstr)-1)
  2352.             StrCopy(locstr,work)
  2353.             close:=TRUE
  2354.         ENDIF
  2355.  
  2356.         j:=InStr(locstr,'^')
  2357.         IF j <> -1
  2358.             MidStr(work,locstr,j+1)
  2359.             self.expo[sze]:=Val(work)
  2360.             MidStr(work,locstr,0,j)
  2361.             StrCopy(locstr,work)
  2362.         ELSE
  2363.             self.expo[sze]:=1
  2364.         ENDIF
  2365.  
  2366.         IF action=OP_DIV
  2367.             self.expo[sze]:=-self.expo[sze]
  2368.         ENDIF                                         /*Il faudrait utiliser un Xor...*/
  2369.         IF linv+always=TRUE
  2370.             self.expo[sze]:=-self.expo[sze]
  2371.         ENDIF
  2372.  
  2373.         IF StrCmp(locstr,'1')
  2374.             num:=-1
  2375.             bptr:=-1
  2376.             sze--
  2377.             nilbase:=TRUE
  2378.             self.pfx[sze]:=20
  2379.         ELSE
  2380.             nilbase:=FALSE
  2381.             j:=InStr(locstr,'.')
  2382.             IF j <> -1                                          /*on a un point:  pf.bs */
  2383.                 MidStr(work,locstr,0,j)
  2384.                 FOR k:=0 TO 19
  2385.                     found:=TRUE
  2386.                     EXIT StrCmp(work,pref[k].name)
  2387.                     found:=FALSE
  2388.                 ENDFOR
  2389.                 IF found                                                /*bs ne correspond pas*/
  2390.                     MidStr(work,locstr,j+1)
  2391.                     self.pfx[sze]:=k
  2392.                     num,found:=findbase(work)
  2393.                     bptr:=bases[num]
  2394.                     IF found                                            /*bs correspond*/
  2395.                         self.base[sze]:=String(StrLen(work))
  2396.                         StrCopy(self.base[sze],work)
  2397.                     ELSE                                                /*pf ne correspond pas*/
  2398.                         StringF(msg,'\s \s.\n',cat.msgUnknownUnit.getstr(),locstr)
  2399.                         Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
  2400.                         self.default()
  2401.                         RETURN FALSE
  2402.                     ENDIF
  2403.                 ELSE                                                /*pf correspond*/
  2404.                     StringF(msg,'\s \s.',cat.msgUnknownUnit.getstr(),locstr)
  2405.                     Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
  2406.                     self.default()
  2407.                     RETURN FALSE
  2408.                 ENDIF
  2409.             ELSE                                                /*pas de . trouvés*/
  2410.                 self.pfx[sze]:=20
  2411.                 num,found:=findbase(locstr)
  2412.                 bptr:=bases[num]
  2413.                 IF found=FALSE                                           /*ce n'est pas une base seule*/
  2414.                     FOR j:=0 TO 19
  2415.                         found:=TRUE
  2416.                         EXIT StrCmp(locstr,pref[j].name,1)
  2417.                         found:=FALSE
  2418.                     ENDFOR
  2419.                     IF found
  2420.                         self.pfx[sze]:=j
  2421.                         IF j=9
  2422.                             MidStr(work,locstr,2)
  2423.                         ELSE
  2424.                             MidStr(work,locstr,1)
  2425.                         ENDIF
  2426.                         num,found:=findbase(work)
  2427.                         IF found                                        
  2428.                             self.base[sze]:=String(StrLen(work))        /*pfx + base:ok*/
  2429.                             StrCopy(self.base[sze],work)
  2430.                             bptr:=bases[num]
  2431.                         ELSE                                            /*erreur dans l'unité*/
  2432.                             StringF(msg,'\s \s.\n',cat.msgUnknownUnit.getstr(),locstr)
  2433.                             Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
  2434.                             self.default()
  2435.                             RETURN FALSE
  2436.                         ENDIF
  2437.                     ELSE
  2438.                         StringF(msg,'\s \s.\n',cat.msgUnknownUnit.getstr(),locstr)
  2439.                         Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
  2440.                         self.default()
  2441.                         RETURN FALSE
  2442.                     ENDIF
  2443.                 ELSEIF bptr <> NIL                                  /*c'est une base seule*/
  2444.                     self.base[sze]:=String(StrLen(locstr))
  2445.                     StrCopy(self.base[sze],locstr)
  2446.                 ENDIF
  2447.             ENDIF
  2448.         ENDIF                                             
  2449.  
  2450.         IF (tpe <> NIL) AND (nilbase=FALSE)
  2451.             int:=bptr.type
  2452.             FOR l:=0 TO StrLen(int)-1
  2453.                 sPower[l]:=sPower[l]+((int[l]-78)*(self.expo[sze]))
  2454.             ENDFOR
  2455.         ENDIF
  2456.  
  2457.         IF (npfx<>PFX_ORIGINAL) AND (nilbase=FALSE)
  2458.             self.pfx[sze]:=npfx
  2459.             npfx:=PFX_ORIGINAL
  2460.         ENDIF
  2461.  
  2462.         IF (real <> NIL) AND (nilbase=FALSE)
  2463.             bptr:=bases[num]
  2464.             dMul(dPow( dMul(dPow(ten,pref[self.pfx[sze]].exp,v),bptr.value,v),dFloat(self.expo[sze],w),w),real,real)
  2465.         ENDIF
  2466.         pos1:=pos2+1
  2467.     UNTIL pos2>=strl
  2468.  
  2469.     self.sze:=sze
  2470.  
  2471.     self.simplify()                 /*On simplifie*/    /*(Ça serait mieux d'intégrer*/
  2472.                                                             /*la simplification au processus de décodage,*/
  2473.     IF zero <> NIL                                              /*mais c'est déjà assez buggé comme ça. :-)*/
  2474.         IF (sze = 0) AND (self.pfx[]=20) AND (self.expo[]=1) /*Ça pourrait être un niveau...*/
  2475.             bptr:=bases[num]
  2476.             dCopy(zero,bptr.zero)
  2477.         ELSE
  2478.             dFloat(0,zero)
  2479.         ENDIF
  2480.     ENDIF
  2481.  
  2482.     IF tpe <> NIL
  2483.         FOR j:=0 TO 19
  2484.             tpe[j]:=sPower[j]+78
  2485.         ENDFOR
  2486.     ENDIF
  2487.  
  2488. ENDPROC TRUE
  2489.  
  2490. /****************************************************
  2491. *                                                   *
  2492. *   ptr.default()                                   *
  2493. *                                                   *
  2494. *   en cas d'erreur irrécupérable de modification   *
  2495. *   d'une unité composée (la précédente est donc    *
  2496. *   perdue), appeller default. (PAS POUR LA         *
  2497. *   CREATION!!)                                     *
  2498. *                                                   *
  2499. ****************************************************/
  2500.  
  2501. PROC default() OF composed
  2502.     END self
  2503.     NEW self
  2504.     self.createsimple('m')
  2505. ENDPROC
  2506.  
  2507. PROC getinfo(fact:PTR TO longreal,zero:PTR TO longreal,type:PTR TO CHAR) OF composed
  2508. DEF num,found,
  2509.     j,k,l,w:longreal,v:longreal,
  2510.     sPower[20]:ARRAY OF LONG,int:PTR TO CHAR,
  2511.     msg[50]:STRING
  2512.     FOR j:=0 TO 19
  2513.         sPower[j]:=0
  2514.     ENDFOR
  2515.     dFloat(1,fact)
  2516.     FOR k:=0 TO self.sze
  2517.         num,found:=findbase(self.base[k])
  2518.         IF found
  2519.             bptr:=bases[num]
  2520.             dMul(dPow(dMul( dPow(ten,pref[self.pfx[k]].exp,v), bptr.value, v ),dFloat(self.expo[k],w),w),fact,fact)
  2521.             int:=bptr.type
  2522.             FOR l:=0 TO StrLen(int)-1
  2523.                 sPower[l]:=sPower[l]+((int[l]-78)*(self.expo[k]))
  2524.             ENDFOR
  2525.         ELSE
  2526.             StringF(msg,'\s \s \s',cat.msgLostUnitA.getstr(),self.base[k],cat.msgLostUnitB.getstr())
  2527.             Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
  2528.         ENDIF
  2529.     ENDFOR
  2530.     IF (self.sze = 0) AND (self.pfx[]=20) AND (self.expo[]=1)
  2531.         bptr:=bases[num]
  2532.         dCopy(zero,bptr.zero)
  2533.     ELSE
  2534.         dFloat(0,zero)
  2535.     ENDIF
  2536.     FOR j:=0 TO 19
  2537.         type[j]:=sPower[j]+78
  2538.     ENDFOR
  2539. ENDPROC
  2540.  
  2541. /****************************************************
  2542. *                                                   *
  2543. *   ptr.copycomp(source,arg)                        *
  2544. *                                                   *
  2545. *   copie l'unité source vers ptr.                  *
  2546. *   Mettre arg a NEWC si ptr est nouveau            *
  2547. *                                                   *
  2548. ****************************************************/
  2549.  
  2550. PROC copycomp(source:PTR TO composed,ar=OLDC) OF composed
  2551. DEF j
  2552.     IF ar=OLDC
  2553.         END self.pfx[self.sze+1]
  2554.         END self.base[self.sze+1]
  2555.         END self.expo[self.sze+1]
  2556.     ENDIF
  2557.     self.pfx:=NewR((source.sze+1)*4)
  2558.     self.expo:=NewR((source.sze+1)*4)
  2559.     self.base:=NewR((source.sze+1)*4)
  2560.  
  2561.     self[].sze:=source[].sze
  2562.     FOR j:=0 TO source.sze
  2563.         self.pfx[j]:=source.pfx[j]
  2564.         self.base[j]:=String(StrLen(source.base[j]))
  2565.         StrCopy(self.base[j],source.base[j])
  2566.         self.expo[j]:=source.expo[j]
  2567.     ENDFOR
  2568. ENDPROC
  2569.  
  2570. /****************************************************
  2571. *                                                   *
  2572. *   ptr.simplify()                                  *
  2573. *                                                   *
  2574. *   Simplifie l'unité (m*m->m^2 et m*s/s->m)        *
  2575. *                                                   *
  2576. ****************************************************/
  2577.  
  2578. PROC simplify() OF composed
  2579. DEF j,k,l,found=-1,ok
  2580.                                        /*j: Element en cours (LECTURE UNIQUEMENT!)*/
  2581.     FOR j:=0 TO self.sze               /*k: Element de comparaison (dont on va changer l'exposant*/
  2582.         IF found <> -1                 /*l: Element de destination pour le scrolling*/
  2583.             ok:=FALSE              /*found: Dernier element "final"*/
  2584.             FOR k:=0 TO found
  2585.                 IF StrCmp(self.base[j],self.base[k]) AND (self.pfx[j]=self.pfx[k]) -> l'elem. j correspond au k déja vu.
  2586.                     ok:=TRUE
  2587.                     self.expo[k]:=self.expo[k]+self.expo[j] ->On ajoute les exposants
  2588.                     IF self.expo[k]=0 -> par exemple: m/m
  2589.                         FOR l:=k TO found-1
  2590.                             self.base[l]:=self.base[l+1]
  2591.                             self.expo[l]:=self.expo[l+1]
  2592.                             self.pfx[l]:=self.pfx[l+1]
  2593.                         ENDFOR
  2594.                         found--
  2595.                     ENDIF
  2596.                 ENDIF
  2597.             ENDFOR
  2598.             IF ok=FALSE ->on a rien trouvé, il va falloir en créer un nouveau...
  2599.                 found++
  2600.                 IF found<>j
  2601.                     self.base[found]:=self.base[j]
  2602.                     self.expo[found]:=self.expo[j]
  2603.                     self.pfx[found]:=self.pfx[j]
  2604.                 ENDIF
  2605.             ENDIF
  2606.         ELSE
  2607.             found:=0  ->Au début, le premier élément ne bronche pas.
  2608.         ENDIF
  2609.     ENDFOR
  2610.  
  2611.     self.sze:=found
  2612.  
  2613. ENDPROC
  2614.  
  2615. /****************************************************
  2616. *                                                   *
  2617. *   ptr.inverse(type)                               *
  2618. *                                                   *
  2619. *   Inverse l'unité (ptr:=1/ptr)                    *
  2620. *                                                   *
  2621. *   type:type de l'unité (entrée et sortie)         *
  2622. *                                                   *
  2623. ****************************************************/
  2624.  
  2625. PROC inverse(tpe) OF composed
  2626. DEF j
  2627.     FOR j:=0 TO self.sze
  2628.         self.expo[j]:=-self.expo[j]
  2629.     ENDFOR
  2630.     FOR j:=0 TO 19
  2631.         tpe[j]:=156-tpe[j]
  2632.     ENDFOR
  2633. ENDPROC
  2634.  
  2635. /****************************************************
  2636. *                                                   *
  2637. *   ptr.siConvert(value)                            *
  2638. *                                                   *
  2639. *   Pour convertir value_ptr dans son équivalent SI *
  2640. *   ptr et value sont modifiés.                     *
  2641. *                                                   *
  2642. ****************************************************/
  2643.  
  2644. PROC siConvert(value:PTR TO longreal) OF composed
  2645. DEF found,j,k,l,sPower[20]:ARRAY OF LONG,compBuf:PTR TO composed,sze,int:PTR TO CHAR,
  2646.     v:longreal,w:longreal,msg[50]:STRING
  2647.  
  2648.     dFloat(1,t)
  2649.  
  2650.     NEW compBuf
  2651.  
  2652.     FOR j:=0 TO 19
  2653.         sPower[j]:=0
  2654.     ENDFOR
  2655.     FOR j:=0 TO self.sze                              /*j contient le numéro de la 'powerbase' de self*/
  2656.         k,found:=findbase(self.base[j])
  2657.         bptr:=bases[k]                                /*k contient le numéro de l'unité de base utilisée */
  2658.         IF found=FALSE
  2659.             StringF(msg,'\s \s \s',cat.msgLostUnitA.getstr(),self.base[j],cat.msgLostUnitB.getstr())
  2660.             Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
  2661.             RETURN
  2662.         ENDIF
  2663.         int:=bptr.type
  2664.         FOR l:=0 TO StrLen(bptr.type)-1
  2665.             sPower[l]:=sPower[l]+((int[l]-78)*(self.expo[j]))
  2666.         ENDFOR
  2667.         dMul(value,dPow(dMul( dPow(ten,pref[self.pfx[j]].exp,v), bptr.value, v ),dFloat(self.expo[j],w),w))
  2668.     ENDFOR
  2669.     NEW compBuf.base[20]
  2670.     NEW compBuf.pfx[20]
  2671.     NEW compBuf.expo[20]
  2672.     sze:=-1
  2673.     FOR j:=0 TO 19                                     /*sze contient le numéro de la 'powerbase' de compBuf*/
  2674.         IF sPower[j]<>0
  2675.             sze++
  2676.             ptr:=si[j]
  2677.             compBuf.base[sze]:=ptr.base[]
  2678.             compBuf.pfx[sze]:=ptr.pfx[]
  2679.             compBuf.expo[sze]:=sPower[j]
  2680.             k,found:=findbase(ptr.base[])
  2681.             bptr:=bases[k]                              /*k contient le numéro de l'unité de base utilisée */
  2682.             IF found=FALSE
  2683.                 StringF(msg,'\s \s \s',cat.msgLostUnitA.getstr(),ptr.base[],cat.msgLostUnitB.getstr())
  2684.                 Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
  2685.                 RETURN
  2686.             ENDIF
  2687.             dMul(t,dPow(dMul( dPow(ten,pref[compBuf.pfx[sze]].exp,v),bptr.value, v ),dFloat(compBuf.expo[sze],w),w))
  2688.         ENDIF
  2689.     ENDFOR
  2690.     compBuf.sze:=sze
  2691.     END self
  2692.     NEW self
  2693.     NEW self.base[sze+1]
  2694.     NEW self.pfx[sze+1]
  2695.     NEW self.expo[sze+1]
  2696.  
  2697.     self.copycomp(compBuf)
  2698.  
  2699.     END compBuf
  2700.     dMul(value,t)
  2701. ENDPROC t
  2702.  
  2703. /****************************************************
  2704. *                                                   *
  2705. *   END ptr                                         *
  2706. *                                                   *
  2707. *   Destructeur de la classe composed               *
  2708. *                                                   *
  2709. ****************************************************/
  2710.  
  2711. PROC end() OF composed
  2712.     END self.base[self.sze+1]
  2713.     END self.pfx[self.sze+1]
  2714.     END self.expo[self.sze+1]
  2715. ENDPROC
  2716.  
  2717. PROC readu(rgt=FALSE)
  2718.     mget(bt_a,MUIA_Selected,{z})
  2719.     IF z=MUI_TRUE
  2720.         z:=OP_MUL
  2721.     ELSE
  2722.         mget(bt_b,MUIA_Selected,{z})
  2723.         IF z=MUI_TRUE
  2724.             z:=OP_DIV
  2725.         ELSE
  2726.             z:=OP_REPL                      /*i=préfixe*/
  2727.         ENDIF                               /*q=chaîne*/
  2728.     ENDIF
  2729.  
  2730.     mget(l_pfx,MUIA_List_Active,{i})
  2731.     doMethodA(l_units,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{q}])
  2732.  
  2733.     IF rgt
  2734.         IF i = 10 -> Original
  2735.             IF unit2.decode(z,q,t,PFX_ORIGINAL,zero2,type2) = FALSE
  2736.                 Mui_RequestA(app,window,0,cat.msgInternalFailureT.getstr(),NIL,cat.msgInternalFailure.getstr(),NIL)
  2737.                 RETURN
  2738.             ENDIF
  2739.             IF z<>OP_REPL
  2740.                 StrCopy(r,unit2.comp2str())
  2741.             ELSE
  2742.                 StrCopy(r,q)
  2743.             ENDIF
  2744.         ELSE -> Remplace le préfixe
  2745.             IF i = 11
  2746.                 i:=20
  2747.             ELSEIF i > 11
  2748.                 i:=i-2
  2749.             ENDIF
  2750.             IF unit2.decode(z,q,t,i,zero2,type2) = FALSE
  2751.                 Mui_RequestA(app,window,0,cat.msgInternalFailureT.getstr(),NIL,cat.msgInternalFailure.getstr(),NIL)
  2752.                 RETURN -> JUMP out -> See below :-)
  2753.             ENDIF
  2754.             StrCopy(r,unit2.comp2str())
  2755.         ENDIF
  2756.         set(ud,MUIA_String_Contents,r)
  2757.         dCopy(fact2,t)
  2758.     ELSE
  2759.         IF i = 10 -> Original
  2760.             IF unit1.decode(z,q,t,PFX_ORIGINAL,zero1,type1) = FALSE
  2761.                 Mui_RequestA(app,window,0,cat.msgInternalFailureT.getstr(),NIL,cat.msgInternalFailure.getstr(),NIL)
  2762.                 RETURN -> JUMP out -> Eeeek!
  2763.             ENDIF
  2764.             IF z<>OP_REPL
  2765.                 StrCopy(r,unit1.comp2str())
  2766.             ELSE
  2767.                 StrCopy(r,q)
  2768.             ENDIF
  2769.         ELSE -> Remplace le préfixe
  2770.             IF i = 11
  2771.                 i:=20
  2772.             ELSEIF i > 11
  2773.                 i:=i-2
  2774.             ENDIF
  2775.             IF unit1.decode(z,q,t,i,zero1,type1) = FALSE
  2776.                 Mui_RequestA(app,window,0,cat.msgInternalFailureT.getstr(),NIL,cat.msgInternalFailure.getstr(),NIL)
  2777.                 RETURN -> JUMP out -> Aargh!
  2778.             ENDIF
  2779.             StrCopy(r,unit1.comp2str())
  2780.         ENDIF
  2781.         set(ug,MUIA_String_Contents,r)
  2782.         dCopy(fact1,t)
  2783.     ENDIF
  2784.     chkzero()
  2785.     set(l_pfx,MUIA_List_Active,10)
  2786. ENDPROC
  2787.  
  2788. PROC replace(list,item,replacement:PTR TO CHAR)
  2789.     point:=String(StrLen(replacement))
  2790.     StrCopy(point,replacement)
  2791.     set(list,MUIA_List_Quiet,MUI_TRUE)
  2792.     doMethodA(list,[MUIM_List_Remove,item])
  2793.     doMethodA(list,[MUIM_List_InsertSingle,point,item])
  2794.     set(list,MUIA_List_Quiet,FALSE)
  2795. ENDPROC
  2796.  
  2797. PROC askstr(title,default,mode)
  2798.     mode:=NIL
  2799. /*    SELECT mode
  2800.     CASE BASE
  2801.         set(strstr,MUIA_String_Accept,NIL)
  2802.         set(strstr,MUIA_String_Reject,'/.*"()^ ')
  2803.     CASE NUMERIC
  2804.         set(strstr,MUIA_String_Accept,'0123456789.Ee')
  2805.         set(strstr,MUIA_String_Reject,NIL)
  2806.     CASE COMPOSED
  2807.         set(strstr,MUIA_String_Accept,NIL)
  2808.         set(strstr,MUIA_String_Reject,NIL)
  2809.     CASE GROUP
  2810.         set(strstr,MUIA_String_Accept,NIL)
  2811.         set(strstr,MUIA_String_Reject,NIL)
  2812.     ENDSELECT      */
  2813.     set(strwin,MUIA_Window_Title,title)
  2814.     set(strstr,MUIA_String_Contents,default)
  2815.     set(strwin,MUIA_Window_Open,MUI_TRUE)
  2816. ENDPROC
  2817.  
  2818. PROC addcomp(group,unit:PTR TO composed,pos)
  2819. DEF /*cont:PTR TO group,*/old,list:PTR TO LONG,j,tempstr:PTR TO CHAR,myptr:PTR TO composed
  2820.  
  2821.  
  2822.     cont:=groups[group]
  2823.  
  2824.     list:=NewR((cont.sze+2)*4)
  2825.     IF pos <> 0
  2826.         FOR i:=0 TO pos-1
  2827.             list[i]:=cont.list[i]
  2828.         ENDFOR
  2829.     ENDIF
  2830.     NEW myptr
  2831.     list[pos]:=myptr
  2832.     myptr.copycomp(unit,NEWC)
  2833.     IF pos <> (cont.sze+1)
  2834.         FOR i:=pos TO cont.sze
  2835.             list[i+1]:=cont.list[i]
  2836.         ENDFOR
  2837.     ENDIF
  2838.  
  2839.     old:=cont.list
  2840.     END old[cont.sze+1]
  2841.     cont.list:=list
  2842.     cont.sze:=cont.sze+1
  2843.  
  2844.     mget(l_groups,MUIA_List_Active,{j})
  2845.     IF j=group
  2846.         nunits++
  2847.         unit.comp2str()
  2848.         tempstr:=String(EstrLen(str))
  2849.         StrCopy(tempstr,str)
  2850.         doMethodA(l_units,[MUIM_List_InsertSingle,tempstr,pos])
  2851.         set(l_units,MUIA_List_Active,pos)
  2852.     ENDIF
  2853. ENDPROC
  2854.  
  2855. PROC delcomp(grpn,unitn)
  2856. DEF cc:PTR TO composed,j
  2857.     gptr:=groups[grpn]
  2858.     IF gptr.sze=0
  2859.         IF glen=0
  2860.             bip()
  2861.             RETURN FALSE
  2862.         ENDIF
  2863.         doMethodA(l_groups,[MUIM_List_Remove,grpn])
  2864.         FOR j:=grpn TO glen-1
  2865.             groups[j]:=groups[j+1]
  2866.         ENDFOR
  2867.         glen--
  2868.         _returnid(ID_OPENG)
  2869.         RETURN TRUE
  2870.     ELSE
  2871.         cc:=gptr.list[unitn]
  2872.         END cc
  2873.         IF unitn <> gptr.sze
  2874.             FOR j:=unitn TO gptr.sze-1
  2875.                 gptr.list[j]:=gptr.list[j+1]
  2876.             ENDFOR
  2877.         ENDIF
  2878.         gptr.sze:=gptr.sze-1
  2879.     ENDIF
  2880. ENDPROC FALSE
  2881.  
  2882. /****************************************************
  2883. *                                                   *
  2884. *   success:=addbase(value,composed,name[,pos])     *
  2885. *                                                   *
  2886. *   Ajoute une unité de base à la position pos (à   *
  2887. *   la fin si non précisé), équivalente à value     *
  2888. *   composed; avec le nom name.                     *
  2889. *                                                   *
  2890. ****************************************************/
  2891.  
  2892. PROC addbase(value:PTR TO longreal,composed:PTR TO composed,name:PTR TO CHAR,pos=-1)
  2893. DEF /*list:PTR TO LONG,*/bb:PTR TO base,real:longreal,
  2894.     j,found,v:longreal,w:longreal
  2895. DEF k,l,sPower[20]:ARRAY OF LONG,int:PTR TO CHAR,dint:PTR TO CHAR,msg[50]:STRING
  2896.     IF dCompare(value,dFloat(0,v))=0
  2897.         Mui_RequestA(app,window,0,cat.msgNoZeroBaseT.getstr(),cat.msgAbort.getstr(),cat.msgNoZeroBase.getstr(),NIL)
  2898.         RETURN FALSE
  2899.     ENDIF
  2900.            /*RECHERCHE DE .type*/
  2901.     NEW bb
  2902.     bb.name:=String(StrLen(name))
  2903.     StrCopy(bb.name,name)
  2904.     dCopy(real,value) /*CALCUL DE .value*/
  2905.     FOR j:=0 TO 19
  2906.         sPower[j]:=0
  2907.     ENDFOR
  2908.     IF composed > 0 -> Si composed est négatif, c'est une nouvelle unité (SI n° -composed  )
  2909.         FOR j:=0 TO composed.sze                          /*j contient le numéro de la "powerbase" de composed*/
  2910.             k,found:=findbase(composed.base[j])           /*k contient le numéro de l'unité de base utilisée */
  2911.             IF found
  2912.                 bptr:=bases[k]
  2913.                 int:=bptr.type
  2914.                 FOR l:=0 TO StrLen(bptr.type)-1
  2915.                     sPower[l]:=sPower[l]+((int[l]-78)*(composed.expo[j]))
  2916.                 ENDFOR
  2917.                 dMul(dPow(dMul( dPow(ten,pref[composed.pfx[j]].exp,v), bptr.value, v ),dFloat(composed.expo[j],w),w),real,real)
  2918.             ELSE
  2919.                 StringF(msg,'\s \s \s',cat.msgLostUnitA.getstr(),composed.base[j],cat.msgLostUnitB.getstr())
  2920.                 Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
  2921.             ENDIF
  2922.         ENDFOR
  2923.     ELSE
  2924.         sPower[-composed]:=1
  2925.     ENDIF
  2926.     dCopy(bb.value,real)
  2927.     dFloat(0,bb.zero)
  2928.     NEW dint[21]
  2929.     FOR j:=0 TO 19
  2930.         dint[j]:=sPower[j]+78
  2931.     ENDFOR
  2932.     dint[20]:=NIL -> Pour être une chaîne correcte!
  2933.  
  2934.     bb.type:= dint
  2935.  
  2936.     a:=String(StrLen(name))
  2937.     StrCopy(a,name)
  2938.     IF pos=-1 OR (pos = (nbases+1))
  2939.         nbases++
  2940.         bases[nbases]:=bb
  2941.         IF basegroup
  2942.             doMethodA(l_units,[MUIM_List_InsertSingle,a,MUIV_List_Insert_Bottom])
  2943.         ENDIF
  2944.     ELSE
  2945.         /*De nbases+1 -> pos+1*/
  2946.         j:=nbases+1
  2947.         REPEAT
  2948.             bases[j]:=bases[j-1]
  2949.             j--
  2950.         UNTIL j=pos
  2951.         bases[pos]:=bb
  2952.         IF basegroup
  2953.             doMethodA(l_units,[MUIM_List_InsertSingle,a,pos])
  2954.         ENDIF
  2955.         nbases++
  2956.     ENDIF
  2957. ENDPROC TRUE
  2958.  
  2959. PROC delbase(basn)
  2960. DEF cc:PTR TO base,j
  2961.     IF nbases > 1
  2962.         cc:=bases[basn]
  2963.         END cc
  2964.         IF basn <> nbases
  2965.             FOR j:=basn TO nbases-1
  2966.                 bases[j]:=bases[j+1]
  2967.             ENDFOR
  2968.         ENDIF
  2969.         nbases--
  2970.     ELSE
  2971.         Mui_RequestA(app,window,0,cat.msgCancel.getstr(),0,cat.msgOneBase.getstr(),0)
  2972.     ENDIF
  2973. ENDPROC
  2974.  
  2975. PROC gsort()
  2976. DEF results:PTR TO LONG,todo:PTR TO LONG,big,small,
  2977. j,k,len,g1:PTR TO group,g2:PTR TO group,g3:PTR TO group,b,s,first
  2978.                                        /*big et small sont des n° de list (groups)*/
  2979.     NEW results[glen+1]                /*todo[x] sont des n° de list (groups) aussi*/
  2980.     NEW todo[glen+1]
  2981.  
  2982.     FOR j:=0 TO glen
  2983.         todo[j]:=j
  2984.     ENDFOR
  2985.  
  2986.     len:=glen -> n° du dernier elem de ToDo
  2987.  
  2988.  
  2989.     WHILE len > -1
  2990.         b:=1;s:=1
  2991.         k:=0
  2992.         first:=todo[]
  2993.         big:=first
  2994.         small:=first                          /*k contient le n° du dernier echappé*/
  2995.         FOR j:=1 TO len
  2996.             g1:=groups[big]                   /*j contient le n° du prochain todo à mettre*/
  2997.             g2:=groups[todo[j]]
  2998.             g3:=groups[small]
  2999.             IF strord(g1.title,g2.title)=-1
  3000.                 IF (b=0)
  3001.                     todo[k++]:=big                  /*on a trouvé un "meilleur" big*/
  3002.                 ELSE
  3003.                     b:=0
  3004.                 ENDIF
  3005.                 big:=todo[j]
  3006.             ELSEIF strord(g3.title,g2.title)=1
  3007.                 IF (s=0)
  3008.                     todo[k++]:=small
  3009.                 ELSE
  3010.                     s:=0
  3011.                 ENDIF
  3012.                 small:=todo[j]                  /*on a trouvé un "meilleur" small*/
  3013.             ELSE
  3014.                 todo[k++]:=todo[j]              /*j n'a servi a rien*/
  3015.             ENDIF
  3016.  
  3017.         ENDFOR
  3018.         IF (b=0) AND (s=0)                      /*first n'a pas été élu*/
  3019.             todo[k++]:=first
  3020.         ENDIF
  3021.         results[(glen-len)/2]:=groups[small]
  3022.         results[glen-((glen-len)/2)]:=groups[big]
  3023.         len:=len-2
  3024.     ENDWHILE
  3025.     IF len=1
  3026.         results[(glen+1)/2]:=todo[]
  3027.     ENDIF
  3028.     FOR j:=0 TO glen
  3029.         groups[j]:=results[j]
  3030.     ENDFOR
  3031.     END results[glen+1]
  3032.     END todo[glen+1]
  3033. ENDPROC
  3034.  
  3035. PROC comparebase(order,f:PTR TO base,s:PTR TO base)
  3036. DEF msg:PTR TO CHAR
  3037.     IF order=SR_ALPHA
  3038.         RETURN strord(f.name,s.name)
  3039.     ELSEIF order=SR_NUMERIC
  3040.         RETURN dCompare(f.value,s.value)
  3041.     ELSE
  3042.         msg:=String(50)
  3043.         StringF(msg,'\s \d',cat.msgUnknowncomp.getstr(),order)
  3044.         Mui_RequestA(app,window,0,cat.msgSort.getstr(),NIL,msg,NIL)
  3045.     ENDIF
  3046. ENDPROC
  3047.  
  3048. PROC bsort(order)
  3049. DEF results:PTR TO LONG,todo:PTR TO LONG,big,small,
  3050. j,k,len,g1:PTR TO base,g2:PTR TO base,g3:PTR TO base,b,s,first
  3051.     NEW results[nbases+1]               /*big et small sont des n° de list (bases)*/
  3052.     NEW todo[nbases+1]                  /*todo[x] sont des n° de list (bases) aussi*/
  3053.  
  3054.     FOR j:=0 TO nbases
  3055.         todo[j]:=j
  3056.     ENDFOR
  3057.  
  3058.     len:=nbases -> n° du dernier elem de ToDo
  3059.  
  3060.     WHILE len > -1
  3061.         b:=1;s:=1
  3062.         k:=0
  3063.         first:=todo[]
  3064.         big:=first
  3065.         small:=first                        /*k contient le n° du dernier echappé*/
  3066.         FOR j:=1 TO len
  3067.             g1:=bases[big]                  /*j contient le n° du prochain todo à mettre*/
  3068.             g2:=bases[todo[j]]
  3069.             g3:=bases[small]
  3070.             IF comparebase(order,g1,g2)=-1
  3071.                 IF (b=0)
  3072.                     todo[k++]:=big                  /*on a trouvé un "meilleur" big*/
  3073.                 ELSE
  3074.                     b:=0
  3075.                 ENDIF
  3076.                 big:=todo[j]
  3077.             ELSEIF comparebase(order,g3,g2)=1
  3078.                 IF (s=0)
  3079.                     todo[k++]:=small
  3080.                 ELSE
  3081.                     s:=0
  3082.                 ENDIF
  3083.                 small:=todo[j]                  /*on a trouvé un "meilleur" small*/
  3084.             ELSE
  3085.                 todo[k++]:=todo[j]              /*j n'a servi a rien*/
  3086.             ENDIF
  3087.  
  3088.         ENDFOR
  3089.         IF (b=0) AND (s=0)                      /*first n'a pas été élu*/
  3090.             todo[k++]:=first
  3091.         ENDIF
  3092.         results[(nbases-len)/2]:=bases[small]
  3093.         results[nbases-((nbases-len)/2)]:=bases[big]
  3094.         len:=len-2
  3095.     ENDWHILE
  3096.     IF len=1
  3097.         results[(nbases+1)/2]:=todo[]
  3098.     ENDIF
  3099.     FOR j:=0 TO nbases
  3100.         bases[j]:=results[j]
  3101.     ENDFOR
  3102. ENDPROC
  3103.  
  3104. PROC comparecomp(order,f:PTR TO composed,s:PTR TO composed,reals:PTR TO longreal,j,k)
  3105. DEF t[15]:STRING,u[15]:STRING,msg:PTR TO CHAR
  3106.     IF order=SR_ALPHA
  3107.         StrCopy(t,f.comp2str())
  3108.         StrCopy(u,s.comp2str())
  3109.         RETURN strord(t,u)
  3110.     ELSEIF order=SR_NUMERIC
  3111.         RETURN dCompare(reals[j],reals[k])
  3112.     ELSE
  3113.         msg:=String(50)
  3114.         StringF(msg,'\s \d',cat.msgUnknowncomp.getstr(),order)
  3115.         Mui_RequestA(app,window,0,cat.msgSort.getstr(),NIL,msg,NIL)
  3116.     ENDIF
  3117. ENDPROC
  3118.  
  3119. PROC csort(order,grp)
  3120. DEF results:PTR TO LONG,todo:PTR TO LONG,big,small,v:longreal,w:longreal,
  3121. j,k,l,len,g1:PTR TO base,g2:PTR TO composed,g3:PTR TO composed,b,s,first,parent:PTR TO LONG,sz,reals:PTR TO longreal
  3122.  
  3123.     gptr:=groups[grp]
  3124.     parent:=gptr.list;sz:=gptr.sze
  3125.     NEW results[sz+1]               /*big et small sont des n° de list (parent)*/
  3126.     NEW todo[sz+1]                  /*todo[x] sont des n° de list (parent) aussi*/
  3127.     IF order=SR_NUMERIC
  3128.         NEW reals[sz+1]
  3129.         FOR j:=0 TO sz
  3130.             dFloat(1,reals[j])
  3131.             ptr:=parent[j]
  3132.             FOR k:=0 TO ptr.sze
  3133.                 l:=findbase(ptr.base[k])
  3134.                 bptr:=bases[l]
  3135.                 dMul(dPow(dMul( dPow(ten,pref[ptr.pfx[k]].exp,v), bptr.value, v ),dFloat(ptr.expo[k],w),w),reals[j],reals[j])
  3136.             ENDFOR
  3137.         ENDFOR
  3138.     ENDIF
  3139.  
  3140.     FOR j:=0 TO sz
  3141.         todo[j]:=j
  3142.     ENDFOR
  3143.  
  3144.     len:=sz -> n° du dernier elem de ToDo
  3145.  
  3146.     WHILE len > -1
  3147.         b:=1;s:=1
  3148.         k:=0
  3149.         first:=todo[]
  3150.         big:=first
  3151.         small:=first                        /*k contient le n° du dernier echappé*/
  3152.         FOR j:=1 TO len
  3153.             g1:=parent[big]                  /*j contient le n° du prochain todo à mettre*/
  3154.             g2:=parent[todo[j]]
  3155.             g3:=parent[small]
  3156.             IF comparecomp(order,g1,g2,reals,big,todo[j])=-1
  3157.                 IF (b=0)
  3158.                     todo[k++]:=big                  /*on a trouvé un "meilleur" big*/
  3159.                 ELSE
  3160.                     b:=0
  3161.                 ENDIF
  3162.                 big:=todo[j]
  3163.             ELSEIF comparecomp(order,g3,g2,reals,small,todo[j])=1
  3164.                 IF (s=0)
  3165.                     todo[k++]:=small
  3166.                 ELSE
  3167.                     s:=0
  3168.                 ENDIF
  3169.                 small:=todo[j]                  /*on a trouvé un "meilleur" small*/
  3170.             ELSE
  3171.                 todo[k++]:=todo[j]              /*j n'a servi a rien*/
  3172.             ENDIF
  3173.  
  3174.         ENDFOR
  3175.         IF (b=0) AND (s=0)                      /*first n'a pas été élu*/
  3176.             todo[k++]:=first
  3177.         ENDIF
  3178.         results[(sz-len)/2]:=parent[small]
  3179.         results[sz-((sz-len)/2)]:=parent[big]
  3180.         len:=len-2
  3181.     ENDWHILE
  3182.  
  3183.     IF len=1
  3184.         results[(sz+1)/2]:=todo[]
  3185.     ENDIF
  3186.  
  3187.     FOR j:=0 TO sz
  3188.         parent[j]:=results[j]                 /*ON DOIT POUVOIR OPTIMISER ÇA*/
  3189.     ENDFOR
  3190.  
  3191.     /*END parent[sz+1]
  3192.     parent:=results*/
  3193. ENDPROC
  3194.  
  3195. PROC strord(a:PTR TO CHAR,b:PTR TO CHAR)    /*si a vient avant b, RETURN -1*/
  3196. DEF j,k                                     /*si a vient après b, RETURN  1*/
  3197.     k:=Min(StrLen(a),StrLen(b))             /*si StrCmp(a,b),     RETURN  0*/
  3198.     FOR j:=0 TO k-1
  3199.         EXIT a[j] <> b[j]
  3200.     ENDFOR
  3201.     IF a[j] < b[j] THEN RETURN -1                ->abc < adc
  3202.     IF a[j] > b[j] THEN RETURN 1                 ->adc > abc
  3203.     IF StrLen(a) < StrLen(b) THEN RETURN -1      ->abc < abcd
  3204.     IF StrLen(a) > StrLen(b) THEN RETURN 1       ->abcd > abc
  3205. ENDPROC 0                                        ->abc = abc
  3206.  
  3207. PROC findbase(s)
  3208. DEF bp:PTR TO base,n,found                   /* n[,found]:=findbase(str) */
  3209.     FOR n:=0 TO nbases
  3210.         bp:=bases[n]
  3211.         found:=TRUE
  3212.         EXIT StrCmp(s,bp.name)
  3213.         found:=FALSE
  3214.     ENDFOR
  3215. ENDPROC n,found
  3216.